[c] 이중 포인터

소양·2022년 1월 16일
0

c

목록 보기
3/3

이중 포인터

포인터: 어떤 값(value)의 "주소"를 가리키는 변수

이중 포인터: 포인터를 값으로 갖는 포인터

배열에서 배열의 주소 값과 0번째 인덱스의 주소가 같다.

2차원 배열에서는?

2차원 배열 arr이 있을 때, arr과 arr[0], arr[0][0]은 주소 값이 같다.
다시 말해 배열 arr은 arr[0]의 주소 값을 가지고 arr[0]은 arr[0][0]의 주소 값을 가진다.

2차원배열에서의 이중포인터

포인터 연산

#include <stdio.h>

int main()
{
	int arr[2][3] = { {1, 2, 3}, {11, 12, 13} };

	printf("arr       : %d\n", arr);
	printf("arr+1     : %d\n\n", arr+1);

	printf("arr[0]    : %d\n", arr[0]);
	printf("arr[0]+1  : %d\n", arr[0]+1);
}

👉 출력 결과

arr       : 5242464
arr+1     : 5242476
arr[0]    : 5242464
arr[0]+1  : 5242468

1차원(int) 배열의 경우, 주소 값+1 연산 시 4가 증가한다.

근데, 왜 arr + 1은 12가 증가할까?

위에서 선언한 arr 배열은 row 2, col 3 크기이다.
따라서, 4 byte가 3개씩(col) 한 row를 구성한다.
이에 따라 주소값 + 1 이 12(4 byte * 3)씩 증가하게 된다.

이중 포인터의 함수

#include <stdio.h>

void swap(int** num1, int** num2);

int main()
{
    int num1 = 10;
    int num2 = 20;

    int* point_num1 = &num1;
    int* point_num2 = &num2;

    printf("변경전\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);

    swap(&point_num1, &point_num2);

    printf("변경전\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);
}

void swap(int** num1, int** num2) 
{
    int* tmp;        
    tmp = *num1;
    *num1 = *num2;
    *num2 = tmp;
}

👉 출력 결과

// 변경 전
num1 : 10
num2 : 20

// 변경 후
num1 : 20
num2 : 10

swap 함수 실행 이후, 포인터 tmp가 추가되어 각 변수의 주소 값이 num1 -> 20, num2 -> 10으로 변경된다.


⭐ 정리하기 ⭐

  • 2차원 배열 포인터 할당 : 가로 크기(열)가 지정된 포인터에만 할당 가능

  • 할당 방식 : int (*포인터)[열 크기] = 배열명;

  • *(포인터 + 1) : 배열의 한 row을 건너뛴 값을 가리킨다. (배열의 크기에 따라 +1 에서 실제 계산되는 주소 byte 다름)

  • (*(포인터 + 1) + 1) : 배열의 한 행을 건너뛴 포인터가 한 열을 건너뛴 값을 가리킨다.

profile
쭈구리석사 🍀

0개의 댓글