스택 구조에서 변수들은 A가 가장 먼저 만들어지고 가장 밑에 깔리게 된다.
그 다음 iArray 배열이 만들어지고 A이 위에 쌓이게 된다.
그 다음 변수 B가 만들어 지고 iArray배열 위에 쌓기게 되면서 완성이 된다.
허나 여기서 iArray 배열의 내부는 스택구조의 영향을 받지 않는다. 보통대로 순서대로 만들어진다.
인덱스 [0]부터 [4]까지 순서대로 만들어진다고 생각하면 된다.


밑에 코드는 *(iArray + 0)은 iArray의 0번지의 값을 불러온다는 뜻이다. 나머지는 그 순서대로 출력한다.
iArray을 %p로 출력하였기에 iArray의 주소가 출력된다.
#include<stdio.h>
int main()
{
int A = 0X12345678;
int iArray[5] = {100,101,102,103,104};
int B = 0XABCDEF12;
printf("%d\n", *(iArray + 0));
printf("%d\n", *(iArray + 1));
printf("%d\n", *(iArray + 2));
printf("%d\n", *(iArray + 3));
printf("%d\n", *(iArray + 4));
printf("%p\n",iArray);
return 0;
}

밑에 코드에서
printf("%d\n", *p);
printf("%d\n", *(p + 0));
printf("%d\n", p[0]);은 모두 같은 값을 출력한다.
디스어셈블리로 보게 되면 다르다는것을 알수 있다.(밑에 그림을 참조해라)
허나 printf("%d\n", *p); 과 printf("%d\n", *(p + 0));은 같은 과정을 따르지만 printf("%d\n", p[0]);은 더 많은 과정을 따른다.
그렇기에 포인터로 하는것이 더 빠르다고 할수 있다.
#include<stdio.h>
int main()
{
int A = 100;
int B = 200;
int* p = &A;
int iArray[2];
printf("%d\n", *p);
printf("%d\n", *(p + 0));
printf("%d\n", p[0]);
printf("-------------------------\n");
p = &B;
printf("%d\n", p[0]);
return 0;
}


iArray = &B;에서 오류가 난것을 알수 있다.
iArray에는 변수 자리인데 상수가 와서 이렇게 되었다.

밑에 코드를 보면
char* str = "ABCDEFG"; ( 포인터 )
char arr[] = "ABCDEFG"; ( 배열 ) 이 있다.
밑에 그림을 통해 보면 쉽게 이해가 될것이다.
str은 code영역의 "ABCDEFG"을 가리킨다.
arr[]은 stack영역에 생긴다.
그래서 str[0] = 'Z'를 하게 되면 나가리가 된다. WHY? str을 가리키는 "ABCDEFG"은 code영역에 있어서 읽을수는 있지만 쓸수는 없다. 허나 arr[]은 stack영역에 있기에 읽고 쓰기가 가능해서 수정이 가능하다.

#include<stdio.h>
int main()
{
char* str = "ABCDEFG"; //포인터
char arr[] = "ABCDEFG"; //배열
printf("%c\n",str[0]);
printf("%c\n",arr[0]);
//str[0] = 'Z';
arr[0] = 'Z';
printf("str [%s]\n", str);
printf("arr [%s]\n", arr);
return 0;
}

Tip.
변하지 않는거면 포인터로 만든다.
변하는것이람녀 배열로 만드는 것이다.
허나 여기서 배열로 만들게 되면 용량이 포인터에 비해 많이 든다. 이 부분을 고려해야 한다.