포인터 배열과 배열 포인터

2019. 11. 13. 16:23PL/C++

포인터 배열과 배열 포인터은 비슷한 느낌을 주지만 분명히 다른 표현이다

선언 자체에서 다른데, 포인터 배열은 포인터가 여러 개 포함된 배열을 의미한다. 배열 포인터는 배열을 지칭하는 포인터로 보면 된다

 

포인터 배열은 int *p[3]과 같이 int *p[0], int *p[1], int *p[2] int형 자료형의 주소를 가리킬 수 있는 포인터 변수가 3개 있는 것을 알 수 있다. 배열 포인터는 포인터 배열과 선언이 유사한데 소괄호를 붙인다는 점에서 다르다. 즉 int (*p)[3]처럼 선언을 하는데 이는 int 형 배열의 크기를 3을 갖는 배열의 시작 주소를 가리키게 된다

 

#include <stdio.h>
void init_arr(int (*arr)[2]) {
int i, j, cnt = 1;
for(i=0; i<3; i++) {
for(j=0; j<2; j++) {
arr[i][j] = cnt++;
}
}
}
void print_arr(int (*arr)[2]) {
int i, j;
for(i=0; i<3; i++) {
for(j=0; j<2; j++) {
printf("arr[%d][%d] = %d\n", i, j, arr[i][j]);
}
}
}
void init_pnt_arr(int **pnt_arr, int (*arr)[2]) {
int i;
for(i=0; i<3; i++) {
pnt_arr[i] = arr[i];
}
}
void test_arr_pnt(int (*p)[3]) {
int i, j;
for(i=0; i<2; i++) {
for(j=0; j<3; j++) {
printf("p[%d][%d] = %d\n", i, j, p[i][j]);
}
}
}
void test_arr_func(int (*p)[2]) {
printf("**p = %d\n", **p);
printf("*(*p+1) = %d\n", *(*p+1));
printf("*(*p+3) = %d\n", *(*p+3));
printf("**(p+1) = %d\n", **(p+1));
printf("**(p+2) = %d\n", **(p+2));
}
void test_p_func(int (*p)[3]) {
printf("**p = %d\n", **p);
printf("*(*p+1) = %d\n", *(*p+1));
printf("*(*p+2) = %d\n", *(*p+2));
printf("**(p+1) = %d\n", **(p+1));
printf("*(*(p+1)+2) = %d\n", *(*(p+1)+2));
}
int main(void) {
int i;
int arr[3][2] = {0};
int *pnt_arr[3] = {0}; // 포인터 배열
int (*p)[3] = NULL; // 배열 포인터
init_arr(arr);
print_arr(arr);
init_pnt_arr(pnt_arr, arr);
for(i=0; i<3; i++) {
printf("*pnt_arr[%d] = %d\n", i, *pnt_arr[i]);
}
p = arr;
test_arr_pnt(p);
test_arr_func(arr);
test_p_func(p);
return 0;
}
view raw pointer_arr.c hosted with ❤ by GitHub

'PL > C++' 카테고리의 다른 글