Programming/C_C++

포인터와 배열의 관게

gukbap 2012. 2. 23. 22:45
반응형
날 괴롭힌 난제들 중 하나인데.. 
구글링 결과 대충(정말로 대충) 결과를 얻긴 얻었다.

int *ptr[2];
int (*ptr)[2];


int *ptr[2]는 직역한 대로 '포인터 변수를 배열로 가진다'이고,
int (*ptr)[2]는 'int xx[2]라는 배열 자체를 포인터하는 변수이다'라고 할 수 있다.

이 점 유의하고 시작하자.

int n[2];
int (*ptr)[2];

p = n; //에러
p = &n[0]; //에러
p = &n; //정상


n, &n[0], &n은 모두 같은 값을 가지게 된다. 하지만 값이 같다고 무작정 쳐넣으면 안된다. 자료형이 다르기 때문이다.

정리하자면
n[0] 은 int
&n[0] 은 int*
n 은 int[]
&n 은 int(*) []

여기까지는 괜찮은데 그 다음부터가 좀 이해가 안 된다.

int n[2][2];
int (*ptr)[2];

p = n; //정상
p = &n[0]; //정상


실제 메모리 상에서는 그렇지 않지만 여기서 n[0]은 또다시 길이가 2인 배열의 시작점인 n[0][0]을 가리킨다고 생각하자.

우선 n은 n[0]을 가리키는데 n[0]은 int [2]이므로 (int*)[2]라고 할 수 있다.
고로 &n은 int(*)[2]
오 하다보니까 이해가 되네ㅋ

n[0]은 n[0][0]을 가리키는 int [2]이므로 &n[0]은 int(*)[2]가 되겠다.

&n은 n이 int[2][2]이므로 int(*)[2][2]라고 할 수 있겠다.

와.. 내가 끝냈네.

 
반응형

'Programming > C_C++' 카테고리의 다른 글

char*, char[] 차이  (0) 2016.11.14
상속  (0) 2011.10.10
C++에서의 파일 입출력 **  (0) 2011.08.18
전처리기 활용 **  (0) 2011.08.17
전처리기  (0) 2011.08.17