포인터: 어떤 값(value)의 "주소"를 가리키는 변수
이중 포인터: 포인터를 값으로 갖는 포인터
배열에서 배열의 주소 값과 0번째 인덱스의 주소가 같다.
2차원 배열 arr이 있을 때, arr과 arr[0], arr[0][0]은 주소 값이 같다.
다시 말해 배열 arr은 arr[0]의 주소 값을 가지고 arr[0]은 arr[0][0]의 주소 값을 가진다.
#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 배열은 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)
: 배열의 한 행을 건너뛴 포인터가 한 열을 건너뛴 값을 가리킨다.