16장 내용 정리
다차원 배열
다차원 배열이란 2차원 이상의 배열을 의미하는 것이다.
2차원 배열만 개념적으로 잘 이해하고 있으면, 그 이상의 배열은 이해하기 수월하다.
뿐만 아니라 3차원 이상의 배열은 일반적으로 사용되지 않는다.
2차원 배열에서 선언과 동시에 초기화하는 경우, 첫 번째 인덱스만 생략 가능하다.
1 2 | int arr1[][4] = {1,2,3,4,5,6,7,8}; int arr2[][2] = {1,2,3,4,5,6,7,8}; | cs |
17장 내용 정리
더블 포인터가 가리키는 것은 싱글 포인터
더블 포인터(double pointer) 선언
1 | int **dp | cs |
더블 포인터건, 싱글 포인터건 무조건 메모리 공간의 주소 값을 저장하는 변수이다.
따라서 모든 포인터 변수는 4바이트 메모리 공간을 요구한다.
다만 차이가 나는 것은 포인터가 가리키는 대상이다.
예제 코드
1 2 3 4 5 6 7 8 9 | int main(void) { double val = 3.14; double *ptr1 = &val; // 싱글 포인터 double **ptr2 = &ptr1; // 더블 포인터 /* 더블 포인터는 싱글 포인터의 주소 값을 저장하기 위한 용도로 사용되는 포인터다. */ | cs |
더블 포인터에 의한 Call-By-Reference
두 개의 포인터가 가리키고 있는 대상을 바꿔주는 기능의 함수를 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> void pswap(int **p1, int **p2); int main(void) { int A = 10, B = 20; int *pA, *pB; pA = &A, pB = &B; // 함수 호출 전 printf("pA가 가리키는 변수 : %d \n", *pA); printf("pB가 가리키는 변수 : %d \n", *pB); pswap(&pA, &pB); // 함수 호출 후 printf("pA가 가리키는 변수 : %d \n", *pA); printf("pB가 가리키는 변수 : %d \n", *pB); return 0; } void pswap(int **p1, int **p2) { int *temp; temp = *p1; *p1 = *p2; *p2 = temp; } | cs |
[그림 1]
[그림 2]
[그림 3]
[그림 4]
포인터의 필요성
이 책을 다 보고 난 후에, 공부해야 할 것이 자료 구조와 알고리즘이다.
이 둘은 전산학에 있어서도 상당히 중요한 위치를 차지하고 있을 뿐만 아니라, 앞으로 어떠한 분야를 공부하건 간에 튼튼한 기초가 되어 줄 것이다.
자료 구조를 공부하게 되면 포인터의 필요성을 보다 확실하게 느낄 수 있다.
연습문제 17-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /* 두 개의 int형 포인터와 길이가 5인 int형 배열을 선언한 다음, 총 5개의 정수를 사용자로부터 입력을 받는다. 그러고 나서 두 개의 포인터와 배열을 함수 MaxMin의 인자로 전달한다. 함수 호출이 완료되고나면 max와 min은 배열의 최대값과 최소값을 가리키고 있어야 한다. */ #include <stdio.h> void MaxMin(int *arr, int size, int **mx, int **mn); int main(void) { int arr[5]; int *max, *min; int i; for (i = 0; i<5; i++) { printf("정수 입력 : "); scanf("%d", &arr[i]); } MaxMin(arr, sizeof(arr) / sizeof(int), &max, &min); printf("최대 : %d, 최소 : %d \n", *max, *min); return 0; } void MaxMin(int *arr, int size, int **mx, int **mn) { int i; int *max, *min; max = min = arr; for (i = 0; i<size; i++) { if (*max < arr[i]) max = &arr[i]; if (*min > arr[i]) min = &arr[i]; } *mx = max; *mn = min; } | cs |
|
'Books > 열혈강의 C 프로그래밍' 카테고리의 다른 글
[열혈C] 06. Part3 Chapter20 도전! 프로그래밍 THREE (0) | 2018.04.27 |
---|---|
[열혈C] 05. Part3 Chapter19 함수 포인터와 void 포인터 (0) | 2018.04.26 |
[열혈C] 04. Part3 Chapter18 다차원 배열과 포인터의 관계 (0) | 2018.04.25 |
[열혈C] 02. Part2 내용 정리 (포인터와 배열의 시작) (0) | 2018.04.19 |
[열혈C] 01. Part1 내용 정리 (C 언어의 기본) (0) | 2018.04.19 |