#include <stdio.h>
main()
{
int imsi[3][2] = { {3,5,}, {12,54}, {534,923} };
int (*imsip)[2];
int *temp[2];
imsip = imsi; // (1)
imsip = &imsi[0][0];// (2)
temp[0] = imsi; // (3)
temp[0] = imsi[0]; // (4)
temp[1] = imsi[1]; // (5)
temp[2] = imsi[2]; // (6)
temp[0] = *(imsi + 0); // (7)
temp[1] = *(imsi + 1); // (8)
temp[2] = *(imsi + 2); // (9)
*temp = imsi[0];// (10)
*(temp + 0) = imsi[0]; // (11)
*(temp + 1) = imsi[1]; // (12)
*(temp + 2) = imsi[2]; // (13)
*temp = *imsi;
*(temp + 0) = *(imsi + 0); // (14)
*(temp + 1) = *(imsi + 1); // (15)
*(temp + 2) = *(imsi + 2); // (16)
}
gcc -o 3_14 3_14.c
3_14.c: In function ‘main’:
3_14.c:10: warning: assignment from incompatible pointer type (2)
3_14.c:12: warning: assignment from incompatible pointer type (3)
(2)해설
imsip는2차원 배열 포인터이며2차원 배열에 대한 주소가 할당 되어야한다.
imsi와&imsi[0][0]의 출력 값이 0x0000011로 동일한데 왜 할당 할 수 없는걸까?
그이유는 imsi는2차원 배열 전체를 가리키는 대상체이며 출력되는값은 그 대상체의 첫번째 행의 첫번째 배열 요소의 주소값이다.
sizeof를 통해 출력해보면 그 값은 24 byte가 될 것이다.
반면, &imsi[0][0]은 첫번째 행의 첫번째 배열요소 자체의 주소값을 가리키고 있다.
따라서, sizeof를 통해 출력해보면 그 값은4byte가 될 것이다.
(3) 해설
imsi가 뜻하는주소 값을 temp[0]이라는 포인터 변수에할당 한다는 것은 문법적으로 문제가없는 것 같지만 대상체에 대한 개념으로 보면 맞지 않는다.
즉,temp[0]은 1차원 배열만을 받을 수 있는 포인터 변수이며2차원 배열인 imsi를 할당 받을 수 없는 것이다.
(4),(5),(6)
imsi[0]은 2차원 배열 imsi의 부분배열로써 1차원 배열이 되며, 1차원배열 temp[0]에 할당 하는 것은 문제가 없다.
(7),(8),(9)
*(imsi + 0)은 *imsi와 같고 *imsi는 imsi[0]의 다른 표현이므로 temp[0] = imsi[0] 수식은 성립한다.
(11),(12),(13)
*temp는 *(temp+ 0)와 같고 이것은 temp[0]과 겸해서사용할수 있다.
(14),(15),(16)
*imsi를 이용하여 주소값을 취하고 이 주소값을 *temp에 할당하였다
--------------------------------------------------------------------------------------------------
gcc -o 3_7_1 3_7_1.c
./3_7_1
imsi : bf8febcc 24
&imsi : bf8febcc 4
imsi[0] : bf8febcc 12
&imsi[0] : bf8febcc 4
imsi[1] : bf8febd8 12
&imsi[1] : bf8febd8 4
imsi[2] : bf8febe4 12
&imsi[2]: bf8febe4 4
imsi[0][0] : 80484f9 4
&imsi[0][0] : bf8febcc 4
imsi[0][1] : 5a19b5 4
&imsi[0][1] : bf8febd0 4
&imsi는 트정한 대상을 가리키는 것이 아니라단지 주소 값일 뿐이므로sizof(&imsi)는 4가 출력된다.
imsi[0][0]은 정수 값을 저장할 수 있기 때문에 출력 값은 당연히 정수.초기화를 해주지 않았기 때문에 쓰레기 값이 출력. 정수를 저장할 수 있는 영역이므로 4가 출력.
imsi[0][0]은 imsi, imsi[0] 등과는 확연히 구분되는 특징은 바로 메모리를 할당 받는 것이다. 따라서, imsi[0][0]과 &imsi[0][0]은같을 수가 없다.
imsi[0][0]은 imsi[0][0]에 저장된 값을뜻하며, &imsi[0][0]은 imsi[0][0]에 할당된 메모리 주소를 뜻한다.
--------------------------------------------------------------------------------------------------
gcc -o 3_7_2 3_7_2.c
./3_7_2
*imsi : bfa3b4fc 8
*imsi[0]: 80483e9 4
(*imsi)[0] : 80483e9 4
imsi+0 : bff1d1dc 4
*(imsi+0) : bff1d1dc 8
주의해야 할 사항
imsi+0과 *(imsi+0) 은 같지 않다.
imsi+0 과 *(imsi+0) 의 출력 값은 같지만 대상체가 완전히 달라지므로 같은 것이 아니다.
imsi+0은 imsi에서 0번째 떨어진 배열 요소를 가리키는 의미 밖에 없으므로 대상이 4byte에 불과하다.
*(imsi+0) 은 대상체를 포함하는 개념이므로sizeof()를 이용하면 8byte가된다.
--------------------------------------------------------------------------------------------------
'C언어' 카테고리의 다른 글
Chapter 6. scanf()와 fgets() (0) | 2011.10.16 |
---|---|
Chapter 2. 1차원 배열과 포인터 (0) | 2011.10.16 |
Chapter 3. 2차원 배열과 포인터 (0) | 2011.10.16 |
문자열관련 예제 (0) | 2011.10.16 |
Chapter 1. 포인터의 기초 (0) | 2011.10.16 |