본문 바로가기

C언어

실행결과

#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+0imsi에서 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