• 검색 결과가 없습니다.

CHAP 3:배열, 구조체, 포인터

N/A
N/A
Protected

Academic year: 2022

Share "CHAP 3:배열, 구조체, 포인터"

Copied!
63
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

C로 쉽게 풀어 쓴 자료구조

CHAP 3:배열, 구조체, 포인터

(2)

C로 쉽게 풀어쓴 자료구조

배열

 같은 형의 변수를 여러 개 만들 때

int A0, A1, A2, A3, …,A9;

int A[10];

 언제 배열을 사용하면 효율적인 프로그래밍이 되는가?

- 반복 코드를 작성할 때

예) 최대값을 구하는 프로그램 . 만약 배열이 없었다면?

0 1 2 3 4 5 6 7 8 9

max=score[0];

for(i=1;i<n;i++){

if( score[i] > max)

max = score[i];

}

(3)

배열 ADT

 배열이란?

- <인덱스, 요소> 쌍의 집합

 인덱스에 대해 해당 요소가 대응되는 구조

배열 ADT

객체: <인덱스, 요소> 쌍의 집합 연산:

▪ create(n) ::= n개의 요소를 가진 배열의 생성.

▪ retrieve(A, i) ::= 배열 A의 i번째 요소 반환.

▪ store(A, i, item) ::= 배열 A의 i번째 위치에 item 저장.

(4)

C로 쉽게 풀어쓴 자료구조

1차원 배열

 int A[5];

변수 메모리 주소

A[0] 기본주소 = base A[1]

base

+

1xsizeof(int)

A[2]

base

+ 2xsizeof(int)

A[3]

base

+ 3xsizeof(int)

A[4]

base

+

4xsizeof(int)

A[0] A[1] A[2] A[3] A[4]

(5)

2차원 배열

 int A[3][4];

실제 메모리에서의 위치 A[0][0] A[0][1] A[0][2] A[0][3]

A[1][0] A[1][1] A[1][2] A[1][3]

A[2][0] A[2][0] A[2][0] A[2][0]

A[0][1]

A[0][2]

A[0][3]

A[0][4]

A[1][0]

A[1][2]

A[1][3]

A[1][4]

(6)

C로 쉽게 풀어쓴 자료구조

연습 1

 배열의 활용 - 최대값 찾기

#include <stdio.h>

int main()

{int score[10]={5, 2, 7, 1, 3, 2, 6, 11, 4, 8};

int i, max;

max=score[0];

for(i=0;i<10;i++)

if( score[i] > max)

max = score[i];

printf("최대값은 %d\n", max);

return 0;

}

(7)

연습 2

 배열의 활용 – 2차원 배열

#include <stdio.h>

int main()

{int A[3][4]={{1,2,3,4}, {5,6,7,8}, {9, 10, 11, 12} };

int i, j;

for(i=0;i<3;i++) for(j=0; j<4; j++)

A[i][j]+=1;

for(i=0;i<3;i++) {for(j=0; j<4; j++)

printf("%d ", A[i][j]);

printf("\n");

}

return 0;

}

(8)

C로 쉽게 풀어쓴 자료구조

연습 3

 배열의 활용 – 함수의 매개 변수로서의 배열

#include <stdio.h>

#define MAX_SIZE 10 void sub(int var, int list[]) { var=10;

list[0]=10;

} int main() {

int var;

int list[MAX_SIZE];

var=0;

list[0]=0;

sub(var, list);

printf("var=%d, list[0]=%d \n", var, list[0]);

}

예측해 보세요

(9)

배열의 응용 - 다항식

 다항식

 프로그램에서 다항식을 처리하려고 하면 어떤 자료 구조가 필요한가?

다항식의 덧셈, 뺄셈,곱셈, 나눗셈 연산을 할 때 편리하고 효율적인 자료구조는?

 배열 사용 2가지 방법

방법 1. 다항식의 모든 항을 배열에 저장하는 방법 방법 2. 0이 아닌 항만을 배열에 저장하는 방법

0 1

1

1

...

)

( x a x a x a x a

p

n n

n n

  

(10)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #1

• 지수들은 내림차순으로 정돈

• 모든 차수에 대한 계수값을 배열로 저장

※ A = (n, a

n

, a

n-1

, ... , a

1

, a

0

)

A차수, n+1 coefficients

예)

A(x) = 10x

5

+0x

4

+0x

3

+0x

2

+6x+3

: n = 5

A = (5, 10, 0, 0, 0, 6, 3) : 7 eleme nts

(11)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #1

• 하나의 다항식을 하나의 배열로 표현

#define MAX_DEGREE 100 typedef struct {

int degree;

float coef[MAX_DEGREE];

} polynomial;

polynomial a = { 5, {10, 0, 0, 0, 6, 3} };

0 1

2 3

4

5

0 0 0 6 3

10 x x x x x x

coef

0 1 2 3 4 5 6 7 8 9 10

10 0 0 0 6 2

(12)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #1(계속)

• 장점: 다항식의 각종 연산이 간단해짐

• 단점: 대부분의 항의 계수가 0이면 공간의 낭비가 심함.

• 예) 다항식의 덧셈 연산

while( Apos<=A.degree && Bpos<=B.degree ){

if( degree_a > degree_b ){ // A항 > B항 C.coef[Cpos++]= A.coef[Apos++];

degree_a--;

}

else if( degree_a == degree_b ){ // A항 == B항

C.coef[Cpos++]=A.coef[Apos++]+B.coef[Bpos++];

degree_a--; degree_b--;

}

else { // B항 > A항

C.coef[Cpos++]= B.coef[Bpos++];

degree_b--;

} }

(13)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #2

• a.degree << MAX_DEGREE

⇨ a.coef[MAX_DEGREE]의 대부분이 0이다 ex) A(x) = x

1000

+ 1

A = (1000, 1, 0,..., 0, 1)

↳ 999

• 다항식에서 0이 아닌 항만을 배열에 저장

• (계수, 차수) 형식으로 배열에 저장

– (예) 10x5+6x+3 -> ((10,5), (6,1), (3,0))

(14)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #2

• 다항식에서 0이 아닌 항만을 저장하는 배열

• 하나의 배열로 여러 개의 다항식을 나타낼 수 있음.

struct {

float coef;

int expon;

} terms[MAX_TERMS]={ {10,5}, {6,1}, {3,0} };

3 8

1 7

0 1

3 10

2 3

0 1

0 1 2 3 4 5 6 7 8 9 10

A B avail

coef expon

terms

(15)

C로 쉽게 풀어 쓴 자료구조

다항식 표현 방법 #2(계속)

• 장점: 메모리 공간의 효율적인 이용

• 단점: 다항식의 연산들이 복잡해진다

(예) 다항식의 덧셈 A=8x3+7x+1, B=10x3+3x2+1, C=A+B

3 8

1 7

0 1

3 10

2 3

0 1

0 1 2 3 4 5 6 7 8 9 10

A B avail

coef expon

3 8

1 7

0 1

3 10

2 3

0 1

3 18

2 3

1 7

0 2

0 1 2 3 4 5 6 7 8 9 10

A B C

coef expon

avail

(16)

C로 쉽게 풀어 쓴 자료구조

다항식 덧셈 연산

// C = A + B

void poly_add2(int As, int Ae, int Bs, int Be, int *Cs, int *Ce) {

float tempcoef;

*Cs = avail;

while( As <= Ae && Bs <= Be )

switch(compare(terms[As].expon,terms[Bs].expon)){

case '>': // A의 차수 > B의 차수

attach(terms[As].coef, terms[As].expon);

As++; break;

case '=': // A의 차수 == B의 차수

tempcoef = terms[As].coef +

terms[Bs].coef;

if( tempcoef )

attach(tempcoef,terms[As].expon);

As++; Bs++; break;

case '<': // A의 차수 < B의 차수

attach(terms[Bs].coef, terms[Bs].expon);

Bs++; break;

}

// A의 나머지 항들을 이동함 for(;As<=Ae;As++)

attach(terms[As].coef, terms[As].expon);

// B의 나머지 항들을 이동함 for(;Bs<=Be;Bs++)

attach(terms[Bs].coef, terms[Bs].expon);

*Ce = avail -1;

}

(17)

C로 쉽게 풀어 쓴 자료구조

희소행렬(sparse matrix)

• 배열을 이용하여 행렬(matrix)를 표현하는 2가지 방법

(1) 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 (2) 0이 아닌 요소들만 저장하는 방법

• 희소행렬: 대부분의 항들이 0인 배열





















0 0 0 2 0 0

1 0 0 0 0 0

0 0 0 0 5 6

0 0 0 0 0 0

8 0 0 0 0 9

0 0 7 0 0 0

5 0 7

1 9 8

0 3 2

B A

(18)

C로 쉽게 풀어 쓴 자료구조

희소행렬 표현방법 #1

• 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법

– 장점: 행렬의 연산들을 간단하게 구현할 수 있다.

– 단점: 대부분의 항들이 0인 희소 행렬의 경우 많은 메모리 공 간 낭비

7 8

0 9

5 1 2 3 0 0 1 2 0

1 2

0 0 2 0 1 2

5 0 0 0

0 1 2 0 0 0

0 1 2

4 0 0 1

0 1 2 6 5 0

0 1 2

3 0 0 0

0 1 2 0 0 0

0 1 2

2 0 0 0

0 1 2 9 0 0

0 1 2

1 0 0 8

0 1 2 0 0 0

0 1 2

0 7 0 0

3 4 5

0 0 0 2 0 0

1 0 0 0 0 0

0 0 0 0 5 6

0 0 0 0 0 0

8 0 0 0 0 9

0 0 7 0 0 0

5 0 7

1 9 8

0 3 2

B

A A= B=

(19)

C로 쉽게 풀어 쓴 자료구조

 효율적 기억장소 사상

ⅰ) <i, j, value> : 3-tuples (triples)

ⅱ) no. of rows

ⅲ) no. of columns

ⅳ) no. of non-zero elements

ⅴ) ordering(column major or row major)

희소행렬 표현방법 #2

(20)

C로 쉽게 풀어 쓴 자료구조

희소행렬 표현방법 #2

• 0이 아닌 요소들만 저장하는 방법

– 장점: 희소 행렬의 경우, 메모리 공간의 절약 – 단점: 각종 행렬 연산들의 구현이 복잡해진다.

2 2 5 6

2 0 7 0 1 2 5

1 2 1 0 1 2 4

1 1 9 0 1 2 3

1 0 8 0 1 2 2

0 1 3 0 1 2 1

0 0 2 행 열 값 0

5 2 2 6

4 5 1 0 1 2 5

3 1 5 0 1 2 4

3 0 6 0 1 2 3

1 5 8 0 1 2 2

1 0 9 0 1 2 1

0 3 7 행 열 값 0

0 0 0 2 0 0

1 0 0 0 0 0

0 0 0 0 5 6

0 0 0 0 0 0

8 0 0 0 0 9

0 0 7 0 0 0

5 0 7

1 9 8

0 3 2

B

A A= B=

(21)

C로 쉽게 풀어 쓴 자료구조

희소행렬 연산 비교

• 전치 연산 프로그램의 비교

1) 배열

for (j = 0; j < colums; j++) for (i = 0; i < rows; i++)

b[j][i] = a[i][j];

(22)

C로 쉽게 풀어 쓴 자료구조

희소행렬 연산 비교

2) 0이 아닌 요소들만 저장하는 방법

(23)

C로 쉽게 풀어 쓴 자료구조

구조체

• 구조체(structure): 타입이 다른 데이터를 하나로 묶는 방법

• 배열(array): 타입이 같은 데이터들을 하나로 묶는 방법

구조체

필드 배열

0 1

char carray[100];

struct example { char cfield;

int ifield;

float ffield;

double dfield;

};

struct example s1;

(24)

C로 쉽게 풀어 쓴 자료구조

구조체의 사용 예 #1

• 구조체의 선언과 구조체 변수의 생성

struct person {

char name[10]; // 문자배열로 된 이름

int age; // 나이를 나타내는 정수값 float height; // 키를 나타내는 실수값 };

struct person a; // 구조체 변수 선언

 typedef을 이용한 구조체의 선언과 구조체 변수의 생

typedef struct성 person {

char name[10]; // 문자배열로 된 이름

int age; // 나이를 나타내는 정수값 float height; // 키를 나타내는 실수값 } person;

person a; // 구조체 변수 선언

(25)

구조체 멤버에 접근하려면 연산자 . 을 사용한다

Ex)

구조의 멤버 연산자

구조체의 사용 예 #2

struct person a ;

strcpy(a.name, ”james”

);

a.age = 10;

a.salary = 35000;

(26)

C로 쉽게 풀어 쓴 자료구조

구조체의 대입과 비교 연산

• 구조체 변수의 대입: 가능

struct person {

char name[10]; // 문자배열로 된 이름

int age; // 나이를 나타내는 정수값

float height; // 키를 나타내는 실수값

};

main() {

person a, b;

b = a; // 가능

}

 구조체 변수끼리의 비교: 불가능

main() {

if( a > b )

printf("a가 b보다 나이가 많음"); // 불가능 }

(27)

구조체 연습 #4

#include <stdio.h>

struct person {

char name[10]; // 문자배열로 된 이름

int age; // 나이를 나타내는 정수값

float height; // 키를 나타내는 실수값

};int main()

{ struct person a ;

strcpy(a.name, "james");

a.age = 10;

a.height = 178.5;

printf("name=%s, age=%d, height=%.1f \n", a.name, a.age, a.height);

return 0;

}

(28)

C로 쉽게 풀어 쓴 자료구조

구조체 안의 구조체

typedef struct { int month;

int day;

int year;

} date;

typedef struct human_being { char name[10];

int age;

float salary;

date dob;

};

 구조 속의 또 다른 구조 정의

[예] A person born on February 14, 1988 person1.dob.month = 2;

person1.dob.day = 11;

person1.dob.year = 1944;

(29)

자체참조 구조체 #1

자체 참조 구조체(self-referential structure): 필드 중에 자기 자신을 가리키는 포인터가 한 개 이상 존재 하는 구조체

 연결 리스트나 트리에 많이 등장

typedef struct

ListNode {

char

data[10];

struct

ListNode *link;

} ;

(30)

C로 쉽게 풀어 쓴 자료구조

ListNode item1, item2, item3;

item1.data = ‘a’;

item2.data = ‘b’;

item3.data = ‘c’;

item1.link = item2.link = item3.link = NULL;

‘a’

item1

‘b’

item2

‘c’

item3

자체참조 구조체 #2

NULL

NULL NULL

(31)

C로 쉽게 풀어 쓴 자료구조

• 구조체 연결

item1.link=&item2;

item2.link=&item3;

‘a’

item1

‘b’

item2

‘c’

item3

자체참조 구조체 #3

NULL

(32)

C로 쉽게 풀어 쓴 자료구조

유니언( Union)

• 유니언(union)

union의 필드들은 메모리 공간을 공용

한 필드 만 어느 한 시점에 활동적이 되어 사용 가능

typedef struct sex_type { enum tag_field {female, male} sex;

union {

int children;

int beard;

} u ; };

typedef struct human_being { char name[10];

int age;

float salary;

date dob;

sex_type sex_info;

};

human_being person1, person2;

(33)

구조체 연습 #5

 구조체 배열을 만들어 보라. 정수 항목인 number 와 문자열 항목인 name을 갖는 구조체를 정의하고 크기 가 3인 구조체 배열을 생성하시오.

#define SIZE 10

struct {

int number;

char name[SIZE];

} sa [5];

#define SIZE 10

struct test{

int number;

char name[SIZE];

} ;

struct test sa [3];

(34)

C로 쉽게 풀어쓴 자료구조

연습 5 답

#include <iostream>

#include <string.h>

#define SIZE 10 struct test{

int number;

char name[SIZE];

} ;

int main()

{struct test sa[3];

int i;

sa[0].number=1;

strcpy(sa[0].name, "test0");

sa[1].number=2;

strcpy(sa[1].name, "test1");

sa[2].number=3;

strcpy(sa[2].name, "test2");

for(i=0; i<3; i++)

printf("number %d name=%s \n", sa[i].number, sa[i].name);

return 0;

}

(35)

연습 #6

 person이라는 구조체를 만들어보자. 이 구조체에는 문자 배열로 된 이름, 사람의 나이를 나타내는 정수값, 각 개인 의 월급을 나타내는 float값 등이 변수로 들어가야 한다.

 person 구조체에 생년월일 구조체를 추가하여라 (month, day, year )

(36)

C로 쉽게 풀어쓴 자료구조

연습 #6 답

 person이라는 구조체를 만들어보자. 이 구조체에는 문자 배열로 된 이름, 사람의 나이를 나타내는 정수값, 각 개인 의 월급을 나타내는 float값 등이 변수로 들어가야 한다.

 person 구조체에 생년월일 구조체를 추가하여라 (month, day, year )

struct person {

char name[SIZE];

int age;

float salary;

struct {

int month;

int day;

int year;

} birthday;

}; struct person JMH;

struct date { int month;

int day;

int year;

};

struct person { char name[10];

int age;

float salary;

struct date birthday;

};

struct person JMH;

(37)

C로 쉽게 풀어 쓴 자료구조

포인터(pointer)

• 포인터: 다른 변수의 주 소를 가지고 있는 변수

char a='A';

char *p;

p = &a;

 포인터가 가리키는 내용의 변경: * 연산자 사용

*p= 'B';

(38)

C로 쉽게 풀어쓴 자료구조

포인터(pointer)

 포인터: 다른 변수의 주 소를 가지고 있는 변수

char a='A';

char *p;

p = &a;

 포인터가 가리키는 내용의 변경: * 연산자 사용

*p= 'B';

(39)

포인터와 관련된 연산자

& 연산자: 변수의 주소를 추출

* 연산자: 포인터가 가리키는 곳의 내용을 추출

p // 포인터

*p // 포인터가 가리키는 값

*p++ // 포인터가 가리키는 값을 가져온 다음, 포인터를 한 칸 증가한다.

*p-- // 포인터가 가리키는 값을 가져온 다음, 포인터를 한 칸 감소한다.

(*p)++ // 포인터가 가리키는 값을 증가시킨다.

int a; // 정수 변수 선언 int *p; // 정수 포인터 선언

int **pp; // 정수 포인터의 포인터 선언

p = &a;// 변수 a와 포인터 p를 연결

pp = &p; // 포인터 p와 포인터의 포인터 pp를 연결 char a=‘A’;

(40)

C로 쉽게 풀어쓴 자료구조

디양한 포인터

 포인터의 종류

void *p; // p는 아무것도 가리키지 않는 포인터 int *pi; // pi는 정수 변수를 가리키는 포인터 float *pf; // pf는 실수 변수를 가리키는 포인터 char *pc; // pc는 문자 변수를 가리키는 포인터 int **pp; // pp는 포인터를 가리키는 포인터

struct test *ps; // ps는 test 타입의 구조체를 가리키는 포인터 void (*f)(int) ; // f는 함수를 가리키는 포인터

 포인터의 형변환: 필요할 때마다 형변환하는 것이 가 능하다.

void *p;

pi=(int *) p;

(41)

함수의 파라미터로서의 포인터

 함수 안에서 파라미터로 전달된 포인터를 이용하여 외 부 변수의 값 변경 가능

void swap(int *px, int *py) {

int tmp;

tmp = *px;

*px = *py;

*py = tmp;

}

main() {

int a=1,b=2;

printf("swap을 호출하기 전: a=%d, b=%d\n", a,b);

swap(&a, &b);

printf("swap을 호출한 다음: a=%d, b=%d\n", a,b);

}

(42)

C로 쉽게 풀어쓴 자료구조

배열과 포인터

 배열의 이름: 사실상의 포인터와 같은 역할

 컴파일러가 배열의 이름을 배열의 첫 번째 주소로 대치

(43)

배열과 포인터

int *list1;

int list2[5];

list2 = list2[0]를 가리키는 포인터

list2 + i = list2[i]를 가리키는 포인터

(

list2

+

i

) == &

list2

[

i

],

*(

list2

+

i

) ==

list2

[

i

]

(44)

C로 쉽게 풀어쓴 자료구조

구조체의 포인터

 구조체의 요소에 접근하는 연산자: ->

main() {

struct {

int i;

float f;

} s, *ps;

ps = &s;

ps->i = 2;

ps->f = 3.14;

}

(45)

포인터의 포인터

int a; // 정수 변수 변수 선언 int *p; // 정수 포인터 선언

int **pp; // 정수 포인터의 포인터 선언 p = &a; // 변수 a와 포인터 p를 연결

pp = &p; // 포인터 p와 포인터의 포인터 pp를 연결

(46)

C로 쉽게 풀어쓴 자료구조

포인터 연산

 포인터에 대한 사칙연산: 포인터가 가리키는 객체단위 로 계산된다.

p // 포인터

p+1 // 포인터 p가 가리키는 객체의 바로 뒤 객체

p-1 // 포인터 p가 가리키는 객체의 바로 앞 객체

(47)

포인터 사용시 주의할 점

 포인터가 아무것도 가리키고 있지 않을 때는 NULL로 설정

int *pi=NULL;

 초기화가 안된 상태에서 사용 금지

main()

{ char *pc; // 포인터 pi는 초기화가 안되어 있음

*pc = 'E’; // 위험한 코드

}

 포인터 타입간의 변환 시에는 명시적인 타입 변환 사용

int *pi;

float *pf;

pf = (float *)pi;

(48)

C로 쉽게 풀어쓴 자료구조

포인터연습 #7

int a=10, b=20;

int *p=&a;

printf("a=%d *p=%d \n", a, *p);

b=*p;

printf("a=%d b=%d, *p=%d \n", a, b, *p);

*p=30;

printf("a=%d b=%d, *p=%d \n", a, b, *p);

연습1

int a=10;

printf("a의 값은 %d \n", a);

printf("a의 주소값은 %d \n", &a);

printf("a의 값은 %d \n", *&a);

연습2

(49)

포인터연습 #7

#include <stdio.h>

#include <stdlib.h>

void swap(int a, int b);

int main() {

int a=10, b=20;

printf("a= %d, b=%d \n", a, b);

swap(a, b);

printf("a= %d, b=%d \n", a, b);

return 0;

}

void swap(int a, int b) {

int t;

t=a;

a=b;

b=t;

}

연습3 swap

#include <stdio.h>

#include <stdlib.h>

void swap(int *pa, int *pb);

int main() {

int a=10, b=20;

printf("a= %d, b=%d \n", a, b);

swap(&a, &b);

printf("a= %d, b=%d \n", a, b);

return 0;

}

void swap(int *pa, int *pb) {

int t;

t=*pa;

*pa=*pb;

*pb=t;

}

(50)

C로 쉽게 풀어쓴 자료구조

동적 메모리 할당

프로그램이 메모리를 할당 받는 방법

1. 정적 메모리 할당

2. 동적 메모리 할당

정적 메모리 할당

프로그램이 시작하기 전에 메모리 크기가 결정됨

프로그램의 수행 도중 크기 변경 불가 ex) int A[5];

결정된 크기보다 더 큰 입력은 처리할 수 없고 작은 입력인 경우 메모리

낭비

(예) 변수나 배열의 선언 int buffer[100];

char name[] = “data structure";

동적 메모리 할당

프로그램의 실행 도중 필요한 만큼 메모리를 할당 받음

필요 없을 때는 반납 메모리 효율적 사용

(51)

동적 메모리 할당

 전형적인 동적 메모리 할당 코드

main() { int *pi;

pi = (int *)malloc(sizeof(int)); // 동적 메모리 할당 ... … // 동적 메모리 사용

... free(pi); // 동적 메모리 반납 }

 동적 메모리 할당 관련 라이브러리 함수

malloc(size) // 메모리 할당

free(ptr) // 메모리 할당 해제

sizeof(var) // 변수나 타입의 크기 반환(바이트 단위)

(52)

C로 쉽게 풀어쓴 자료구조

동적 메모리 할당 라이브러리

 malloc(int size)

size 바이트 만큼의 메모리 블록을 할당

(char *)malloc(100) ; /* 100 바이트로 50개의 정수를 저장 */

(int *)malloc(sizeof(int)); /* 정수 1개를 저장할 메모리 확보*/

(struct Book *)malloc(sizeof(struct Book)) /* 하나의 구조체 생성 */

 free(void ptr)

ptr이 가리키는 할당된 메모리 블록을 해제

(53)

동적 메모리 할당 라이브러리

 sizeof 키워드

변수나 타입의 크기 반환(바이트 단위)

size_t i = sizeof( int ); // 4 struct AlignDepends {

char c;

int i;

};

size_t size = sizeof(struct AlignDepends); // 8 int array[] = { 1, 2, 3, 4, 5 };

size_t sizearr = sizeof( array ) / sizeof( array[0] ); //

20/4=5

(54)

C로 쉽게 풀어쓴 자료구조

연습 #8 - 동적 메모리 할당 예제

 정수 항목인 number 와 문자열 항목인 name을 갖는 구조체를 정의하고 크기가 2인 구조체 배열을 동적으로 할당해 보시오.

struct Example { int number;

char name[10];

};

int main() {

struct Example *p;

p=(struct Example *)malloc(2*sizeof(struct Example));

(55)

동적 메모리 할당 예제 8 답

struct Example { int number;

char name[10];

};

void main() {

struct Example *p;

p=(struct Example *)malloc(2*sizeof(struct Example));

if(p==NULL){

fprintf(stderr, "can't allocate memory\n") ; exit(1) ;

}

p->number=1;

strcpy(p->name,"Park");

(p+1)->number=2;

strcpy((p+1)->name,"Kim");

free(p);

}

(56)

C로 쉽게 풀어쓴 자료구조

 앞의 동적 메모리 예제에서 free(p);

메모리를 해제하기 전에 p의 내용을 출력하는 부분을 작성하여 테스트해 보시오.

동적 메모리 할당 예제 8- 계속

…생략

p->number=1;

strcpy(p->name,"Park");

(p+1)->number=2;

strcpy((p+1)->name,"Kim");

for( i=0; i<=1; i++)

printf("struct Example %d: %d, %s\n", i, (p+i)->number, (p+i)->name);

free(p);

…생략

(57)

연습 #9

#1. int i=10; int *p; p=&i; *p=8;의 문장이 수행되면 i값은 얼마인가?

#2. int i=10; int *p; p=&i; (*p)--;의 문장이 수행되면 i값은 얼마인가?

#3. int a[10]; int *p; p=a; *p++=5; 의 문장이 수행되면 변경되는 배 열의 요소는?

#4. int a[10]; int *p; p=a; *++p=5; 의 문장이 수행되면 변경되는 배 열의 요소는?

#5 int a[10]; int *p; p=a; (*p)++; 의 문장이 수행되면 변경되는 배열

의 요소는?

(58)

C로 쉽게 풀어쓴 자료구조

•다음에 대하여 연습해 보시오.

a) 10 개의 원소를 갖는 numbers 라는 float 형의 배열을 선언하고, 원소 들을 0.0, 1.1, 2.2, ... , 9.9 의 값으로 초기화하라. 기호상수 SIZE 는 10 으로 정의되었다고 가정한다.

b) float 형의 객체를 가리키는 포인터 nptr 을 선언하라.

c) 배열 첨자 표기법을 사용하여 배열 numbers 의 원소들을 출력하라. : for(i=0;i<10; i++)

d) 포인터 변수 nptr 에 배열 numbers 의 시작주소를 대입하는 두 개의 다른 문장을 제시하라.

e) 포인터 nptr 을 사용해서 포인터 표기법으로 배열 numbers 의 원소들 을 출력하라.

f) 포인터 nptr 에 첨자를 적용하여 배열 numbers 의 원소들을 출력하라.

연습 #10

(59)

#include <stdio.h>

# define SIZE 10 int main()

{

float numbers[SIZE] = {0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9}; // a) float *nPtr; //b)

int i;

for (i = 0; i < SIZE; i++)

printf(“%.1f ”, numbers[i] ) ; //c) printf(“\n”);

nPtr = numbers; // d) or

nPtr = &numbers[0]; //d) for (i = 0; i < SIZE; i++)

printf(“%.1f ”, *(nPtr + i) ); //e) printf(“\n”);

for (i = 0; i < SIZE; i++)

printf(“%.1f ”, nPtr[i] ); //f) return 0;

}

연습 #10 - 답

(60)

C로 쉽게 풀어쓴 자료구조

Q. 배열 x를 {1, 2, 3, 4, 5, 6}으로 초기화 한 후 포 인터 p를 정의하고 포인터 p에 저장할 주소는 x[2]

로 하고 *(p+3)와 *(p-2) 의 값 및 그 곱을 구하는 프로그램을 작성하여라. (먼저 값을 예측해 보시오)

연습#11

int main() {

int x[]={1,2,3,4,5,6};

int *p=&x[2];

printf(“*(p+3)= %d \n“, *(p+3));

printf(“*(p-2)= %d \n“, *(p-2));

printf(“*(p+3) x *(p-2) = %d \n“, *(p+3) * *(p-2) );

}

(61)

연습#12

1차원 배열을 만들고 원소 값을 입력 받는 함수와 출력하는 함수를 각각 작성해 보시고

(62)

C로 쉽게 풀어쓴 자료구조

#include <stdio.h>

#define SIZE 5

void READM(int n, int *A);

void PRINTM(int n, int *A);

int main() {

int A[SIZE];

READM(SIZE, A);

PRINTM(SIZE, A);

system("PAUSE");

return 0;

return 0;

}

void READM(int n, int *A) {

int i;

printf("Enter %d numbers\n", n);

for(i=0;i<n;i++)

scanf("%d", &A[i]);

return ; }

void PRINTM(int n, int *A) {

int i;

printf("Here are %d numbers\n", n);

for(i=0;i<n;i++)

printf("%d ", A[i]);

printf("\n");

return ; }

(63)

C로 쉽게 풀어 쓴 자료구조

#include <stdio.h>

#define SIZE 5

void READM(int n, int *A);

void PRINTM(int n, int *A);

int main() {

int A[SIZE];

READM(SIZE, A);

PRINTM(SIZE, A);

system("PAUSE");

return 0;

return 0;

}

void READM(int n, int *A) {

int i;

printf("Enter %d numbers\n", n);

for(i=0;i<n;i++)

scanf("%d", &A[i]);

return ; }

void PRINTM(int n, int *A) {

int i;

printf("Here are %d numbers\n", n);

for(i=0;i<n;i++)

printf("%d ", A[i]);

printf("\n");

return ; }

참조

관련 문서

▶ someday라는 미래를 나타내는 말이 있으므로 빈칸에는 미래를 나타 내는 말이 들어가야 한다4. A: Mandy는

신입 회원의 기록이 나타내는 그래프가 기존 회원의 기록을 나타내는 그래프보다 왼쪽으로 치우쳐 있으므로 신입 회원 의 기록이

A반을 나타내는 그래프가 B반을 나타내는 그래프보 다 오른쪽으로 치우쳐 있으므로 A반 학생들이 B반 학생들보다 도서관 이용

2 고맙다고 말하면서 빗자루를‘건네준’것이므로 연속동작을 나타내는 분사구문이 되도록 현재분사 handing 이 알맞다.. 3 첫 번째 빈칸에는 목적어( him

생산성은 생산의 결과를 나타내는 지표로서 산출/투입의 비율의 증감에 따라 생산의 상태가 좋고 나쁨을 비교, 판단하는데 사용.. 생산성의 의미를 생산할 힘(능력)의

중복표기가 빈번하게 등장하는 문헌이다.. 그러나 이는 유일례로서 일반적이지는 않다.. 지금까지 구결자는 표음적인 기능이 우선시되는 문자라는 인식이 강했다..

세 개의 CandyBar 구조체를 원소로 가지는 배열을 만들고, 그 배열의 구조체 원소들을 원하는 값으로 초기화한 다음, 각 구조체의

• 합계란에는 합계시산표를 나타내는 것으로 총계정원장에서 차변과 대변의 합계를 집계한 것이다.. • 잔액란에는 잔액시산표를 나타내는