결론만 말하자면
int a[10] 이라는 배열이 선언되었다면!
*a 와 a[0]은 동일한 의미
*a[i] 은 *(a+1)과 동일 , a[i] 는 *(a+i)와 동일하다.
풀어서 설명하겠습니다.
int a[10] 이라는 배열이 선언되면 a는 배열의 이름을 가진 포인터변수입니다.
(주소값을 가지는 값 a)
그렇다면 *a 는 a가 가진 주소값을 가진 곳의 값을 가지겠죠?
(즉, 배열의 처음값의 주소를 저장한 값이 a)
여기서 중요한 것은!
*(a + 1) 은 단순히 a의 값에서 1이 증가한 값이 아닙니다.
자료형의 바이트 값만큼 증가합니다.무슨 말이냐 하면~
int는 4바이트가 되겠죠?
여기서 1의 증가는 4 바이트 (메모리 값) 의 증가가 됩니다.만약 a의 값이 1004 라면 *(1004 + 4) 가 되겠죠?
그렇다면 1008의 주소에 위치한 값을 가져오게 되는겁니다.결과는? a[1]의 값을 가져오게 되는것이죠....
말을 너무 길게 했네요..ㅎㅎ
제가 이해하려고 한겁니다.
그렇다면 결론은
a[ i ] = *(a + i )가 맞는 결론이 나오고!
이러한 수식을 우리는 Pointer Arithmetic 이라고 부른답니다!
그렇다면 자료형 마다 바이트가 다르니~
#include <stdio.h>
int main(void) {
int data[] = {1, 2, 3};
char data2[] = {'a', 'b', 'c'};
long long data3[] = {1, 2, 3};
int *p = &data[0];
char *q = &data2[0];
long long *r = &data3[0];
printf("%d %x\n", p, p);
printf("%d %x\n", p + 1, p + 1);
printf("%d %x\n", p + 2, p + 2);
printf("%d %x\n", q, q);
printf("%d %x\n", q + 1, q + 1);
printf("%d %x\n", q + 2, q + 2);
printf("%d %x\n", r, r);
printf("%d %x\n", r + 1, r + 1);
printf("%d %x\n", r + 2, r + 2);
return 0;
};
각 포인터 변수 p ,q, r 에 배열의 주소값을 담았다.
long long 의 경우 8 바이트.
printf 의 경우 10진수와 16진수 모두 출력
위와 같은 예제를 만들고! 실행시켜주면~~~
-2044725156 861ff85c
-2044725152 861ff860
-2044725148 861ff864
//p
-2044725159 861ff859
-2044725158 861ff85a
-2044725157 861ff85b
//q
-2044725184 861ff840
-2044725176 861ff848
-2044725168 861ff850
//r
참고로 주소값이 음수입니다.
int 는 4바이트씩
char 은 1바이트씩
long long 은 8 바이트씩 증가하는 모습을 볼수 있습니다.