본문 바로가기

Books/열혈강의 C 프로그래밍

[열혈C] 03. Part3 Chapter16-17 내용 정리 (다차원 배열 / 포인터의 포인터)


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 sizeint **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 sizeint **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





열혈강의 C 프로그래밍
국내도서
저자 : 윤성우
출판 : 프리렉 2003.12.15
상세보기