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);로 잘못 표기하곤하는데 값은 항상 잘 들어간다.
첫 주소가 같기 때문이다.
취업시켜줘 뿌잉뿌잉
syntax sugar
그림으로 배열을 블럭으로 그리고 배열에 +1이냐 아니면 블럭에 +1이냐 이런식으로 그리면 쉽게 이해 가능
괄호의 중요성
arr+1 과 &arr;+1의 주소값은 엄연히 다르다 이 부분이 제 컴파일러에서는 다릅니다.
첫 주소값은 같게 나오겠지만 arr+1 과 &arr;+1의 주소값은 엄연히 다르다. 첫 주소값이 1111이라면 arr+1은 1112 &arr;+1은 1116이 나온다. 방금 이해했습니다. 님은 int arr[5]; 라고 만드셨지만 위 문장에서는 char arr[5]; 을 예로 드셨네요.