c언어를 공부하던 중 "포인터 배열"과 "배열 포인터"가 헷갈려서
이 참에 정리해보고자 한다.
포인터를 저장하는 배열이다.
배열 안에 원소를 담는데 원소 타입이 포인터라고 보면 된다.
int *p[3] = NULL;
배열을 가리키는 포인터이다.
포인터인데 배열을 가리키는 포인터를 말한다.
int (*p)[3] = NULL;
#include <stdio.h>
int main(){
// 포인터 배열
char *p[3] = {"Hello", "World", "!!!"};
printf("*p: %s\n", *p);
printf("p[0]: %s\n", p[0]);
printf("p[1]: %s\n", p[1]);
printf("*(p+1): %s\n", *(p+1));
printf("p[2]: %s\n", p[2]);
printf("*(p+2): %s\n", *(p+2));
printf("\n");
// 배열 포인터
char text[3] = {'H', 'W', '!'};
char (*q)[3] = &text;
printf("*(q[0]): %c\n", *(q[0]));
printf("(*q)[0]: %c\n", (*q)[0]);
printf("(*q)[1]: %c\n", (*q)[1]);
printf("(*(q[0]+1)): %c\n", (*(q[0]+1)));
printf("(*q)[2]: %c\n", (*q)[2]);
printf("(*(q[0]+2)): %c\n", (*(q[0]+2)));
}
*p: Hello
p[0]: Hello
p[1]: World
*(p+1): World
p[2]: !!!
*(p+2): !!!
*(q[0]): H
(*q)[0]: H
(*q)[1]: W
(*(q[0]+1)): W
(*q)[2]: !
(*(q[0]+2)): !
#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[2][3] = {1,2,3,4,5,6};
int (*p)[3] = NULL;
p = arr;
printf("%d\n", *(p[0] + 1) + *(p[1] + 2));
printf("%d\n", *(*(p + 1) + 0) + *(*(p + 1) + 1));
return 0;
}
8
9
맨 뒤에 단어를 중심으로 생각하면 편하다.
포인터 배열 = 포인터를 저장하는 배열
배열 포인터 = 배열을 가리키는 포인터