int arr[2] = {1,2};

printf("%d" , 1[arr]);

printf("%d",[1]arr);

의 값은 같다 왜 같을까?C언에서 포인터와 정수의 덧셈연산에 교환법칙이 성립하도록 정의를 했고, 그래서 *(arr+1)를 뜻하는 arr[1]이나 *(1+arr)을 뜻하는 1[arr] 둘 다 유효하고 같은 표현이다.


int arr[5] = {1,2,3,4,5};

"arr     --> %d\n"

"&arr    --> %d\n" 

"arr+0   --> %d\n" 

"&arr[0]    --> %d\n


의 시작 주소는 같다


하지만 미세하게 다르다


&arr[0] => &*(arr+0) =>&*(arr)=>arr

arr이는 말 그대로  배열의 첫원소의 주소 값을 가리키는 int *타입이다.


&arr이는 arr배열 전체에 대한 포인터 주소이므로 타입은 int *[5]이다


둘의 주소값을 찍어보와도 확연히 차이가 난다.


첫 주소값은 같게 나오겠지만

arr+1 과 &arr+1의 주소값은 엄연히 다르다

첫 주소값이 1111이라면

arr+1은 1112

&arr+1은 1116이 나온다.


가령 나는 인트형 배열을 입력받을때 scanf("%s",arr);를

실수로 scanf("%s",&arr);로 잘못 표기하곤하는데 값은 항상 잘 들어간다.

첫 주소가 같기 때문이다.


취업시켜줘 뿌잉뿌잉