2005년 12월 28일
포인터 배열과 배열의 포인터
오늘 포인터에 대해서 외우는 것이 아니라 제대로 이해를 하기 위해 공부했습니다.
가뜩이나 이해력 딸리는 머리라 뜻을 너무 힘들었습니다. 휴~

일단 CN님의 포인터 구구단에서 우선순위를 읽어봤습니다.

이제 머리를 괴롭혀 볼까요? ㅡㅡ;

int *p[2]; //포인터 배열
int (*p)[2]; //배열의 포인터

포인터 배열은 말그대로 int형 변수의 주소를 값으로 가질 수 있는 2개짜리 포인터 변수입니다.

p[0] = &n1;
p[1] = &n2;

이런식으로 사용합니다.

문제는 배열의 포인터 였습니다.
도대체 이게 무엇을 말하는 것인지 봐도봐도 이해가 안되더군요.
직접 코딩 테스트를 통해서 삽질을 해서 알았습니다.

배열크기가 [SIZE]인 변수를 참조할 수 있는 포인터 이더군요. ㅡㅡ;
저는 계속 (*p)가 2개라고 생각하고 있었습니다.

우선순위에 따라서 읽어보겠습니다.
"(*p)포인터인데 배열[2]짜리 int 형 변수를 가리킬 수 있는 변수"

그런데 문제가...

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

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

n = &n[0] = &n 이 모두 같은 값을 나타내는데 에러가 난다는 것은?
나름대로 이론을 잡아가고 있었는데 이 부분에서 팍 막혀버렸습니다.

처음에는 대충 생각없이 &n과 n의 값은 서로 다를거라고 생각했는데 출력해보니 같은 값;;

디버그를 내용은 아래와 같습니다.
cannot convert from 'int [2]' to 'int (*)[2]' //p = n;
cannot convert from 'int *' to 'int (*)[2]' //p = &n[0];

이런~ 즉, 이말은 변수형이 틀리다는 뜻인가? 패닉에 빠지기 시작합니다.

이렇게 되면 n = &n[0] = &n 가 값이 같다고해서 같다고 생각할 수 없군요.

아래와 같이 표현할 수 있겠습니다.
n[0] 은 int
&n[0] 은 int *
n 은 int []
&n 은 int (*)[]

그렇다면 지금까지 &는 해당변수의 주소값을 나타낸다 라고 생각했는데 단순히 그렇게 생각하면 안되겠습니다.
&는 해당변수의 주소값을 가지고 있는 임시의 포인터변수와 같이 되는 것이라고 해야하지 않을까요?


그럼 이제 좀더 괴로움에 떨어 볼까요? ㅡㅡ;

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

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

&n[0]에서 n[0]는 n[0][0]를 가르키는 int [2]이고 여기에 &를 함으로써 int (*)[2]가 되었습니다.
그렇다면 n은... 머리가 복잡해지네요. ㅠㅠ

n은 n[0]를 가르키는데 n[0]는 int [2]이기에 int [2]를 가르킬 수 있는 n은 int (*)[2]형이어야 한다고 해석할 수 있겠습니다.

참고로 &n은 int (*)[2][2] 라고 나옵니다.
당연히 int[2][2]를 가르킬 수 있는 포인터 변수형은 int (*)[2][2] 일 수 밖에 없겠지요? (ㅡㅡ;)

마지막으로 배열의 포인터라 함은 배열을 가르킬 수 있는 포인터임이 확실하다 라고 말 할 수 있겠습니다.

역시 국내의 암기식 포인터 교육의 한계가 느껴지네요. ㅠㅠ

배열에 포인터가 이렇게 난무하니까 힘드시죠?
하지만 우리에겐 구조체와 클래스가 있습니다. 만세~! ^^
by -A2- | 2005/12/28 19:53 | 개발/플밍 | 트랙백(1) | 덧글(2)
트랙백 주소 : http://ani2life.egloos.com/tb/2063818
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from -kyoe- 하루세번 .. at 2008/01/27 00:18

제목 : [C언어] 2차원 배열의 포인터 타입
1차원 배열의 포인터 타입을 결정할때 우리는 포인터의 자료형과 포인터 연산시 증가하는 바이트 크기가 같다 는것을 알고 있다. 그럼 2차원 배열은 어떨까? 1차원 배열과 같을까? 이렇게 같으면 얼마나 좋으련만.. 그렇지가 않다. 포인터의 자료형은 1차원배열과 마찬가지로 포인터가 가르키는 자료형과 일치하지만 포인터 연산시 증가하는 바이트의 크기가 틀리다. 같은 int형 배열이더라도 증가하는 값은 4byte로 동일한것이아니라 그때 그때 틀리다는 것이......more

Commented by yser at 2005/12/30 00:26
정보문화사의 다시 체계적으로 배우는 C언어 포인터라는 책이 있는데 그걸 한 번 참고해 보세요. 평은 좋더군요. 저도 사놓긴 했는데 대충 훑어보기만 했습니다.

그나저나 읽다보니 무슨 말인지 저도 헷갈리는군요. 프로그램을 전혀 모르는 일반인이 보는 외계어란 이런 느낌일까요. ^^; 전 int* p 식으로 선언하는 습관을 들일려고 합니다. 옛날엔 int *p 식으로 쓰곤 했는데, 선언할 때의 * 가 포인터 변수를 의미하는 것이고, 변수를 참조할 땐 *p 식으로 쓰니 그게 더 의미상 맞겠더군요.
Commented by -A2- at 2005/12/30 02:47
yser// 책 분량이 가벼우면 서점에서 서서 읽어봐야겠습니다. ㅎㅎ

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>