Chapter 8.뒤죽박죽 포인터
int imsi[3] = {5, 3, 8};
printf("%d %d %d\n", imsi[0], imsi[1], imsi[2]);
printf("%d %d %d\n", *imsi, *(imsi + 1), *(imsi + 2));
위의 imsi[0]과 *imsi에 대해서 잘못된 개념을 갖고있다면 정확히 알아보자.
"imsi[0]은 배열이고 *imsi는 포인터이다" 라고생각해서는 안된다.
imsi[0]은 포인터 변수를 배열적으로 표현한 것이고 *imsi는 포인터 변수를 포인터 변수답게 표현한 것이다.
imsi[0]은 imsi가 가리키는 곳에서 얼마나 떨어져 있는지를 첨자를 통해서 표시한 것뿐, 절대 배열이 아님을 명심하자.
8_1.c
#include <stdio.h>
main()
{
int imsi[3] = {5, 3, 8};
printf("%d %d %d\n", imsi[0], imsi[1], imsi[2]);
printf("%d %d %d\n", *(imsi + 0), *(imsi + 1), *(imsi + 2));
printf("%d %d %d\n", *(0 + imsi), *(1 + imsi), *(2 + imsi));
printf("%d %d %d\n", 0[imsi], 1[imsi], 2[imsi]); (1)
}
gcc -o 8_1 8_1.c
./8_1
5 3 8
5 3 8
5 3 8
5 3 8
(1)과 같은 수식에서 보듯이 지금까지 imsi라는 배열을 정의하고 이것을 배여로도 포인터 수식으로도 사용하였다.
즉,배열은 포인터로 완전 분해된다는 것을 알 수 있다.
imsi[i] == *(imsi + i)
i[imsi] == *(i + imsi)
피연산자[피연산자]
하나의피 연산자는 기본 메모리 번지를 뜻하고 나머지 피 연산자는 기본메모리 번지에서 얼마만큼 떨어져 있는지를나타낸다.
기본 메모리에서 얼마만큼 떨어져 있는지를 나타내는 정수는 피 연산자의 위치라면 어디에 있든지 상관없다.
3[imsi] == imsi[3] == *(imsi + 3) == *(3 + imsi)
'C언어' 카테고리의 다른 글
Chapter 12. 될 것 같으면서 안 되는 코드 (0) | 2011.10.16 |
---|---|
Chapter 7. strcpy()의 비밀 (0) | 2011.10.16 |
Chapter 9. 포인터의 개념을 깨는 `0` (0) | 2011.10.16 |
Chapter 4. 문자열과 포인터 (0) | 2011.10.16 |
Chapter 5. 포인터의 포인터 (0) | 2011.10.16 |