본문 바로가기

C언어

Chapter 8. 뒤죽박죽 포인터

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)