포인터의활용포인터의활용
학습목표
■포인터를사용하는다양한방법에대하여알아본다.
■포인터배열을선언하고사용하는방법을알아본다.
■배열에대한포인터를선언하고사용하는방법을알아본다.
■함수에대한포인터를선언하고사용하는방법을알아본다.
■동적메모리가무엇인지알아보고, 동적메모리를할당하고사용한다음해제하는방법을알아본다.
목차
포인터배열.포인터배열의기본.구조체포인터배열배열에대한포인터.배열에대한포인터.배열에대한포인터와이차원배열.배열원소를가리키는포인터와배열에대한포인터함수에대한포인터.함수에대한포인터변수.함수에대한포인터형.함수에대한포인터의활용동적메모리.동적메모리의필요성.동적메모리의할당및해제.동적메모리의활용.동적메모리관련함수
포인터의
활용
.포인터
배열의
기본
포인터
배열의
선언
주소를
저장하는
배엱
포인터의
활용
.포인터
배열의
기본
포인터
배열의
사용(1/4)
포인터
배열의
각
원소.
변수의
주소를
저
장한다.
배열의
각
원소가
포인터형이므로, 원소가
가리키는
변수에
접근하려면
배열의
원소
앞에
간접
참조
연산자
*를
사용해야
한다.
포인터의
활용
.포인터
배열의
기본
포인터
배열의
사용(2/4)
포인터의
활용
.포인터
배열의
기본
int 변수를
가리키는
포인터
배열의
사용
예
01: /* Ex11_01.c */
02: #include
03:
04: int main(void)
05: {
07: int* arr[5] = {&a, &b, &c, &d, &e}; 포인터
배열의
선언
및
초기화
06: int a=10, b=20, c=30, d=40, e=50;
08: int i;
09:
10: for( i = 0 ; i < 5 ; i++ )
11: printf("%d ", *arr[i]); 포인터
배열의
사용
12: printf("\n");
13:
14: return 0;
15: }
포인터의
활용
.포인터
배열의
기본
포인터
배열의
사용(3/4)
포인터
배열의
각
원소에
배열의
시작
주소를
저장핝
수도
있다.
arr[i]가
int 배열의
시작
주소.
초기화되었읁
때, arr[i]가
가리키는
배열의
원소에
접근하려면
arr[i][j] 라고
쓰면
된다.
포인터의
활용
.포인터
배열의
기본
포인터
배열의
사용(4/4)
배열의
시작
주소.
초기화됙
포인터
배엱
포인터의
활용
.포인터
배열의
기본
int 배열의
원소를
가리키는
포인터
배열의
사용
예
01: /* Ex11_02.c */
02: #include
03:
04: int main(void)
05: {
06: int x[3] = {1, 2, 3};
07: int y[3] = {4, 5, 6};
08: int z[3] = {7, 8, 9};
09: int* arr[3] = {x, y, z}; 포인터
배열의
선언
및
초기화
10: int i, j;
11:
12: for( i= 0 ; i< 3 ; i++ )
13: {
14: for( j = 0 ; j < 3 ; j++)
15: printf("%d ", arr[i][j]); 포인터
배열의
사용
16: printf("\n");
17: }
18:
19: return 0;
20: }
포인터의
활용
.구조체
포인터
배열
구조체
포인터
배열의
필요성
구조체배열은메모리를많이사용하므로비효율적이다.
구조체
포인터
배열읁
이용하면
구조체는
동적
메모리에
할당하고
그
주소만
포
인터
배열에
넣어두고
사용핝
수
있다.
구조체포인터배열을준비하고구조체변수를필요할때메모리에할당하고그주소만저장한다.
포인터의
활용
.구조체
포인터
배열
구조체
포인터
배열의
메모리
구조
포인터의
활용
.구조체
포인터
배열
구조체
포인터
배열의
사용
예(1/2)
01: /* Ex11_03.c */
02: #include
03:
04: typedef struct student {
05: char name[20];
06: int korean, english, math;
07: double average;
08: } STUDENT;
09:
10: int main(void)
11: {
12: STUDENT s1 = {" 김모모", 100, 100, 100, 0.0};
13: STUDENT s2 = {" 박나나", 90, 80, 88, 0.0};
15:
STUDENT* std[ ] = {&s1, &s2, &s3};
구조체
포인터
배열의
선언및
초기화
14: STUDENT s3 = {" 이만수", 45, 32, 44, 0.0};
16:
포인터의
활용
.구조체
포인터
배열
구조체
포인터
배열의
사용
예(2/2)
17: int num = sizeof(std) / sizeof(std[0]);
18: int i;
19:
20: for( i= 0 ; i< num ; i++ )
21: std[i]->average = (double)(std[i]->korean+
22: std[i]->english+std[i]->math) / 3;
구조체
포인터
23:
배열의
사용
24: for( i= 0 ; i< num ; i++ )
25: printf("%s %6.2f\n", std[i]->name, std[i]->average);
26:
27: return 0;
28: }
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
선언
배열
전체를
가리키는
포인터
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
사용(1/4)
배열에
대한
포인터에는
배열
전체의
주소를
저장한다.
배엱
전체의
주소를
구하려면
배엱
이륽
앞에
& 연산자를
지정해야
한다
& 연산자
없이
배열의
이름만
사용하면
배열의
첫
번째
원소(arr[0]) 의
주소를
의미한다.
배열에
대한
포인터에는
크기가
같은
배열의
주소만
저장핝
수
있다.
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
사용(2/4)
11장. 포인터의
활용
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
사용(3/4)
p는
배엱
전체의
주소이고, *p는
p가
가리키는
배열이
된다.
*p는
배엱
이름처럼
사용핝
수
있으므로, p가
가리키는
배열의
i번째
원소에
접근
하려면
(*p)[i]를
사용한다.
*p는
p[0] 이므로, (*p)[i]는
p[0][i]와
같다.
배열에
대한
포인터
.배열에
대한
포인터
*p와
p[0]
p가
포인터
변수읹
때
*p와
p[0]은
항상
같다.
*p .
*(p + 0) .
p[0]
int 변수는
크기가
1인
int 배열.
볹
수
있다.
p가
배열에
대한
포인터읹
때
(*p)[i]는
p[0][i]와
항상
같다.
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
사용(4/4)
(*p)[i]와
*p[i]는
서.
의미가
다르므.
주의해야
한다.
(*p)[i]는
p가
가리키는
배열의
i번째
원소라는
의미
*p[i]는
p[i]가
가리키는
값이라는
의미
배열에
대한
포인터
.배열에
대한
포인터
배열에
대한
포인터의
사용
예
01: /* Ex11_04.c */
02: #include
03:
04: int main(void)
05: {
06: int arr[5] = {10, 20, 30, 40, 50};
07:
int (*p)[5] = &arr; 배열에
대한
포인터의
선언및
초기화
08: int i;
09:
10: for( i= 0 ; i< 5 ; i++ )
11: printf("%d ", (*p)[i]); // p[0][i] 또는
*((*p)+i)배열에
대한
포인터로
배열의
원소
접근
12: printf("\n");
13:
14: return 0;
15: }
배열에
대한
포인터
.배열에
대한
포인터와
이차원
배열
배열에
대한
포인터와
이차원
배열(1/3)
배열에
대한
포인터는
이차원
배열의
한
묶음읁
가리키는
용도.
사용된다.
배열에
대한
포인터
.배열에
대한
포인터와
이차원
배열
배열에
대한
포인터와
이차원
배열(2/3)
배열에
대한
포인터를
&arr[0]으.
초기화하는
대신, 간단하게
arr.
초기화핝
수
있다.
배열에
대한
포인터
p.
이차원
배열의
원소에
접근하려면
p가
마치
이차원
배엱
명인
것처럼
2개의
인덱스를
사용하면
된다.
배열에
대한
포인터
.배열에
대한
포인터와
이차원
배열
배열에
대한
포인터와
이차원
배열(3/3)
배열에
대한
포인터는
이차원
배열에
접근하기
위한
용도로
사용된다.
배열에
대한
포인터
.배열에
대한
포인터와
이차원
배열
이차원
배열읁
가리키는
배열에
대한
포인터(1/2)
01: /* Ex11_05.c */
02: #include
03:
04: int main(void)
05: {
06: int arr[3][5] = {
07:
{ 1, 2, 3, 4, 5},
이차원
배열의
08:
{ 6, 7, 8, 9, 10},
선언및
초기화
09:
{11, 12, 13, 14, 15}
10: };
11:
12:
int (*p)[5] = arr; 배열에
대한
포인터의
선언및
초기화
13:
14: int i, j;
15:
배열에
대한
포인터
.배열에
대한
포인터와
이차원
배열
이차원
배열읁
가리키는
배열에
대한
포인터(2/2)
16: for( i= 0 ; i< 3 ; i++)
17: {
18: for( j = 0 ; j < 5 ; j++ )
배열에
대한
포인터로
19: printf("%2d ", p[i][j]); 이차원
배열의
원소
접근
20: printf("\n");
21: }
22:
23: return 0;
24: }
배열에
대한
포인터
.배열의
원소를
가리키는
포인터와
배열에
대한
포인터
배열의
원소를
가리키는
포인터
배엱
원소형에
대한
포인터.
선언
일차원
배열의
시작
주소.
초기화
배열에
대한
포인터
이차원
배열의
제2크기와
같게
배열의
크기를
지정해서
선언
이차원
배열의
시작
주소.
초기화
배열에
대한
포인터
.배열의
원소를
가리키는
포인터와
배열에
대한
포인터
배열의
원소를
가리키는
포인터와
배열에
대한
포인터의
구분
배열에
대한
포인터를
증가시키면
이차원
배열의
제2크기만큼씩
포인터의
주소가
증가된다.
배열에
대한
포인터
.배열의
원소를
가리키는
포인터와
배열에
대한
포인터
배열의
원소를
가리키는
포인터와
배열에
대한
포인터
비교
01: /* Ex11_06.c */
02: #include
03:
04: int GetFactorial(int n);
05: double Add(double x, double y);
06:
07: int main(void)
08: {
09: int (*pFunc)(int n) = &GetFactorial;
함수에
대한
포인터의
선언및
초기화
10: double (*pf)(double, double) = Add;
11: int num;
12:
13: printf(" 정수를
입력하세요
: ");
14: scanf("%d", &num);
15: printf("%d ! = %d\n", num, (*pFunc)(num));
함수에
대한
포인터로
16:
함수
호출
17: printf("0.5 + 1.3 = %f\n", pf(0.5, 1.3));
18:
19: return 0;
20: }
함수에
대한
포인터
.함수에
대한
포인터
변수
함수에
대한
포인터
사용
예(2/2)
22: int GetFactorial(int n)
23: {
24: int fact;
25: int i;
26:
27: for( i= 1, fact= 1 ; i<= n; i++ )
28: fact *= i;
29:
30: return fact;
31: }
32:
33: double Add(double x, double y)
34: {
35: return x + y;
36: }
함수에
대한
포인터
.함수에
대한
포인터형
함수에
대한
포인터형의
정의
함수에
대한
포인터
.함수에
대한
포인터형
함수에
대한
포인터형의
사용
함수에
대한
포인터형도
typedef.
정의됙
데이터형이다.
함수에
대한
포인터형으.
선언됙
변수는
함수에
대한
포인터
변수가
된다.
함수에
대한
포인터
변수를
직접
선언하는
것보다
함수에
대한
포인터형읁
정의하
는
것이
사용하기
간편하다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
퀵
정렬(1/2)
정렬핝
배엱
중에서
키(key) 읁
선택한다.
정렬핝
배열의
원소들읁
키보다
작은
값과
키보다
큰
값의
두
그룹으.
나눈다.
두
그룹에
대해서
각각
다시
퀵
정렬읁
수행한다.
그룹
내에
값이
하나만
남읁
때까지
계속
이
작업읁
반복한다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
퀵
정렬(2/2)
함수에
대한
포인터
.함수에
대한
포인터의
활용
표준
C 라이브러리의
qsort 함수(1/3)
함수명은
몰라도
함수의
주소만
있으면
함수를
호출핝
수
있다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
표준
C 라이브러리의
qsort 함수(2/3)
qsort 함수에서
호출됚
비교
함수를
정의하고, 그
주소를
qsort 함수의
마지막
인
자.
전달한다.
비교
함수의
원형
e1, e2 : qsort 함수에
인자.
전달됙
배엱
원소를
가리키는
포인터
.
e1, e2 는
모두
void* 형
.
사용
전에
배열의
원소를
가리키는
포인터형으.
형
변환
리턴
값
> 0 : e1이
가리키는
원소가
더
크다.
리턴
값
< 0 : e2가
가리키는
원소가
더
크다.
리턴
값
== 0 : e1이
가리키는
원소와
e2가
가리키는
원소의
값이
같다.
기본적인
qsort 함수는
오름차순으.
정렬한다.
내림차순으.
정렬하려면
비교
함수의
리턴
값이
반대가
되도.
정의한다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
표준
C 라이브러리의
qsort 함수(3/3)
int 배열읁
오름차순으.
정렬핝
때
사용됚
비교
함수
qsort 함수는
구조체
배열읁
정렬핝
때도
사용핝
수
있다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
콜백
함수
라이브러리에
의해서
호
출되는
사용자
프로그램
내의
함수
qsort 에
의해서
호출되는
비교
함수도
일종의
콜백
함수이다.
라이브러리.
함수의
주
소를
넘겨주고, 라이브러
리는
함수에
대한
포인터
로
콜백
함수를
호출한다.
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수의
사용(1/2)
01: /* Ex11_08.c */
02: #include
03: #include qsort 함수
사용시
필요한
헤더
04:
05: int Compare(const void *e1, const void *e2); 비교
함수의
선언
06: void PrintArray(const int* arr, int size);
07:
08: int main( )
09: {
10: int x[10] = {34, 50, 5, 17, 82, 66, 73, 1, 48, 29};
11:
12: printf(" 정렩
전
: ");
13: PrintArray(x, 10);
14:
15: qsort(x, 10, sizeof(int), Compare); qsort 함수의
호출
16:
17: printf(" 정렩
후
: ");
18: PrintArray(x, 10);
19:
20: return 0;
21: }
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수의
사용(2/2)
22:
23: int Compare(const void *e1, const void *e2)
24: {
25: int *p1 = (int*) e1;
int 배열
정렬시
26: int *p2 = (int*) e2;
사용될
비교
함수
27: return (*p1 -*p2); // 오름차순
정렩
28: //return -(*p1 -*p2); // 내림차순
정렩
29: }
30:
31: void PrintArray(const int* arr, int size)
32: {
33: int i;
34:
35: for( i= 0 ; i< size ; i++ )
36: printf("%d ", arr[i]);
37: printf("\n");
38: }
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수를
이용한
구조체
배열의
정렬(1/4)
01: /* Ex11_09.c */
02: #include
03: #include
04: #include
05:
06: typedef struct student {
07: char name[20];
08: double ave;
09: } STUDENT;
10:
11: int CompareByName(const void *e1, const void *e2);
12: int CompareByAve(const void *e1, const void *e2);
13: void PrintStudent(const STUDENT* std, int num);
14:
15: int main( )
16: {
17: STUDENT std[5] = {
18: {"이모모", 58.5},
19: {"박모모", 73.9},
20: {"김모모", 87.2},
21: {"최모모", 96.6},
22: {"나모모", 34.3},
23: };
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수를
이용한
구조체
배열의
정렬(2/4)
24:
25: printf("*** 정렩
전
***\n");
26: PrintStudent(std, 5);
27:
28: qsort(std, 5, sizeof(STUDENT), CompareByName); 이름순
정렬
29:
30: printf("*** 이륽
순
정렩
***\n");
31: PrintStudent(std, 5);
32:
33: qsort(std, 5, sizeof(STUDENT), CompareByAve); 평균순
정렬
34:
35: printf("*** 평균
순
정렩
***\n");
36: PrintStudent(std, 5);
37:
38: return 0;
39: }
40:
41: int CompareByName(const void *e1, const void *e2)
42: {
43: STUDENT *p1 = (STUDENT *) e1;
이름순
정렬에
44: STUDENT *p2 = (STUDENT *) e2;
사용될
비교
함수
45: return strcmp(p1->name, p2->name);
46: }
47:
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수를
이용한
구조체
배열의
정렬(3/4)
48: int CompareByAve(const void *e1, const void *e2)
49: {
50: STUDENT *p1 = (STUDENT *) e1;
51: STUDENT *p2 = (STUDENT *) e2;
52: double temp = p1->ave -p2->ave;
평균순
정렬에
53: if( temp == 0 )
사용될
비교
함수
54: return 0;
55: if( temp > 0 )
56: return 1;
57: return -1;
58: }
59:
60: void PrintStudent(const STUDENT* std, int num)
61: {
62: int i;
63: for( i= 0 ; i< 5 ; i++ )
64: printf("%-10s %5.1f\n", std[i].name, std[i].ave);
65: printf("\n");
66: }
함수에
대한
포인터
.함수에
대한
포인터의
활용
qsort 함수를
이용한
구조체
배열의
정렬(4/4)
동적
메모리
정적
메모리
vs. 동적
메모리
동적
메모리
.동적
메모리의
필요성
동적
메모리가
필요한
경욪
배열의
크기를
미리
앋
수
없읁
때, 배열의
크기는
변수.
지정핝
수
없다.
배열의크기는상수로만지정할수있다.
배열의
최대
크기를
가정해서
최대
크기만큼
배열읁
할당핝
수
있다.
메모리낭비발생
동적
메모리를
사용하면
프로그래머가
원하는
만큼
메모리를
할당핝
수
있으므.
메모리
낭비를
최소화핝
수
있다.
동적
메모리를
사용하면
메모리의
할당과
해제시점읁
프로그래머가
마음대.
선
택핝
수
있다.
동적
메모리는
메모리
사용에
있어서
프로그래머에게
최대한의
자유를
보장한다.
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
할당(1/2)
malloc 함수의
원형
size : 할당핝
메모리의
바이트
크기
리턴
값
: 할당됙
메모리의
주소(void* 형) .
특정
포인터형
변수에
저장
.
동적
메모리를
할당핝
수
없으면
NULL 리턴
malloc 함수의
사용
예
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
할당(2/2)
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
사용
동적
메모리의
주소를
저장하는
포인터
변수는
배열의
원소를
가리키는
포인터처
럼
사용한다.
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
해제
free 함수의
원형
memblock : 해제됚
메모리의
주소
free 함수는
인자.
넘겨준
포인터가
가리키는
동적
메모리를
해제한다.
동적
메모리를
해제한
다음에는
동적
메모리를
가리키던
포인터
변수에
NULL읁
대입하는
것이
안전하다.
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
이용
예(1/2)
01: /* Ex11_10.c */
02: #include
03: #include 메모리
관련
함수를
사용하기
위해
필요한
헤더
04:
05: int main( )
06: {
07: int size;
08:
int *arr = NULL; 동적
메모리의
주소를
저장할
포인터
선언
09: int sum = 0;
10: double average = 0.0;
11: int i;
12:
13: printf(" 몆
개의
정수를
입력하시겠습니까? : ");
14: scanf("%d", &size);
15:
16: arr = malloc(sizeof(int)*size);
17: if( arr == NULL )
18: {
동적
메모리의
할당
19:
printf(" 동적
메모리
할당
실패\n");
20:
return -1;
21: }
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
이용
예(2/2)
22:
23: printf("%d 개의
정수를
입력하세요
: ", size);
24: for( i= 0 ; i< size ; i++ )
25: scanf("%d", &arr[i]);
동적
메모리의
사용
26:
27: for( i= 0 ; i< size ; i++ )
28: sum += arr[i];
29:
30: average = (double)sum / (double)size;
31:
32: printf(" 합계
: %d, 평균
: %f\n", sum, average);
33:
34: free(arr);
동적
메모리의
해제
35: arr = NULL;
36:
37: return 0;
38: }
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
사용
과정(1/2)
먼저
동적
메모리의
주소를
저장핝
포인터
변수를
선언한다.
동적
메모리를
할당핝
때는
malloc 함수를
사용한다. malloc 함수의
인자로는
핝
당핝
메모리의
바이트
크기를
지정한다.
동적
메모리를
사용핝
때는
배열의
원소를
가리키는
포인터처럼
사용한다. 즉,
arr[i]처럼
인덱스를
이용한다.
동적
메모리
.동적
메모리의
할당
및
해제
동적
메모리의
사용
과정(2/2)
동적
메모리는
사용이
끝나면
free 함수.
해제한다. 이때
더
이상
해제됙
동적
메
모리를
가리키지
않도.
포인터
변수를
NULL.
만든다.
동적
메모리
.동적
메모리의
활용
동적
메모리와
구조체
포인터
배열(1/3)
프로그램
실행
중에
구조체를
동적
메모리에
할당하고, 그
주소만
포인터
배열에
저장하고
사용핝
수
있다.
직사각형에
대한
정보를
저장핝
구조체
RECT 의
정의
직사각형이
몆
개나
필요한지
미리
앋
수
없으므.
구조체
포인터
배엱
선언
동적
메모리
.동적
메모리의
활용
동적
메모리와
구조체
포인터
배열(2/3)
RECT 구조체는
필요핝
때마다
동적
메모리에
할당하고
그
주소만
포인터
배열의
원소.
저장한다.
arr[i]는
구조체
포인터이므.
구조체의
멤버에
접근핝
때
-> 연산자를
이용한다.
동적
메모리
.동적
메모리의
활용
동적
메모리와
구조체
포인터
배열(3/3)
구조체
포인터
배열읁
사용하면
꼭
필요한
만큼만
구조체를
동적
메모리에
할당.
서
사용핝
수
있다.
사용이
끝난
후에
배열의
원소가
가리키는
동적
메모리를
해제해야
한다.
동적
메모리
.동적
메모리의
활용
동적
메모리에
할당된
구조체를
가리키는
포인터
배열(1/3)
01: /* Ex11_11.c */
02: #include
03: #include
04:
05: typedef struct rect {
06: int x, y;
RECT 구조체의
정의
07: int width, height;
08: } RECT;
09:
10: int main(void)
11: {
12: RECT *arr[100] = {NULL}; 구조체
포인터
배열의
선언
13: int count = 0;
14: int i;
15:
16: while(1)
17: {
18: char choice;
19: printf(" 직사각형읁
만들겠습니까? (Y/N) : ");
동적
메모리
.동적
메모리의
활용
동적
메모리에
할당된
구조체를
가리키는
포인터
배열(2/3)
20: scanf("%c", &choice);
21: fflush(stdin);
22: if( toupper(choice) == 'N' )
23: break;
24:
.25: arr[count] = malloc(sizeof(RECT)); 구조체에
대한
동적
메모리
할당
26: arr[count]->x = rand( )%400;
27: arr[count]->y = rand( )%400;
28: arr[count]->width = rand( )%100;
29: arr[count]->height = rand( )%100;
30: count++;
31: }
32: printf("%d 개의
직사각형이
만들어졌습니다.\n", count);
33:
37: i+1,arr[i]->x,arr[i]->y,arr[i]->width,arr[i]->height);
34: for(i= 0 ; i< count; i++)
구조체
포인터
배열의
사용
35: {
36: printf("%d 번째
직사각형
: (%3d,%3d) w=%3d, h=%3d\n",
38: }
11장. 포인터의
활용
동적
메모리
.동적
메모리의
활용
동적
메모리에
할당된
구조체를
가리키는
포인터
배열(3/3)
39:
40: for(i= 0 ; i < count ; i++)
41: {
동적
메모리의
해제
42: free(arr[i]);
43: arr[i] = NULL;
44: }
45:
46: return 0;
47: }
동적
메모리
.동적
메모리
관련
함수
동적
메모리
관련
함수
학습정리
포인터의
활용
포인터
배엱
: 주소를
저장하는
배엱
int *arr[3];
배열에
대한
포인터: 배엱
전체를
가리키는
포인터
int (*p)[3];
함수에
대한
포인터: 함수를
가리키는
포인터
int (*pf)(int);
함수에
대한
포인터
형: 함수를
가리키는
포인터
형
typedef int (*FUNCPTR)(int);
학습정리
동적
메모리
동적
메모리의
필요성
: 실행
중에
필요한
메모리의
크기를
결정하거나, 함수가
리턴해도
해제되지
않은
메모리가
필요핝
때
동적
메모리를
사용한다.
동적
메모리의
할당
: malloc 함수를
사용한다.
int *arr = malloc(sizeof(int) * size);
동적
메모리의
사용
: 동적
메모리를
가리키는
포인터를
배엱
원소를
가리키는
포
인터처럼
사용한다. 즉, 동적
메모리를
가리키는
포인터를
배엱
이름인
것처럼
사
용한다.
for(i = 0 ; i < size ; i++)
sum += arr[i];
동적
메모리의
해제
: free 함수를
사용한다.
free(arr);