-
포인터와 배열2프로그래밍/C, C++ 2019. 4. 21. 23:22
int arr[4] = {1,2,3,4}; int *p = arr; //배열의 이름이 시작주소
여기서 p[0]의 값은 무엇일까?
마이크로소프트의 C++을 보면
[] 연산자에서 구문적 요구 사항은 식 중 하나가 포인터 형식이고
다른 하나는 정수 계열 형식이어야 한다는 것 밖에 없습니다
그리고 예제를 보면int nArray[5] = { 0, 1, 2, 3, 4 }; cout << nArray[2] << endl; cout << 2[nArray] << endl;
이런 이상한 코드가 있고 둘다 같은 값을 출력합니다.
[]연산자를 사용할 때는, 하나의 포인터와 하나의 정수만 있으면 다 성립한다고 했습니다.
arr은 배열의 이름이므로 주소를 나타내고 포인터입니다.
그래서 포인터 변수에 & 연산자 없이 들어갈 수 있고요
arr[0]는 따지고 보면 arr 이라는 포인터에 가리키고있는 변수의 크기만큼 0번 뛰어라라고 볼 수 있습니다!
위의 예제에서는 int형을 가리키고 있기 때문에 4바이트만큼 0번 뛴 것의 값와 주소와 더한 후, 참조한 값을 보여줍니다.결국에는 *(arr+0)와 arr[0]은 완벽하게 같은 동작을 합니다.
그래서 nArray[2] 와 2[nArray]는 *(nArray + 2)와 *(2 + nArray)로 바뀌기 때문에 에러없이 출력을 합니다
우리 예제에서는 p는 arr과 같으므로 arr[0]는 p[0]와 같습니다
정리
*(p + 0) == p[0]
이거 한문장으로 정리가 될 것 같습니다!
예시
int arr[2][4] = { {1,2,3,4}, {5,6,7,8} }; // int arr[2][4] = {int [4], int[4]}; 이해를 돕기 위한 코드 int (*p)[4] = arr; printf("%d", p[0][3]) // 4 printf("%d", p[1][2]) // 7
위에 코드가 이해가 안되면, 그낭 p에 arr을 대입을 해보시면 좋습니다.
p는 arr을 가리키고 있고, p[0]는 arr[0]과 같고, p[0][3]은 arr[0][3]과 같습니다!p[1][2]의 경우는, p[1]는 *(p + 1)이므로 p가 참조하고 있는 int [4]의 크기만큼 1칸을 뜁니다
그 후, p[1]는 int형을 가리키고 있기 때문에, p[1][2] 는 int의 크기만큼 4만큼 2칸을 뜁니다.따라서 7을 출력합니다.
질문이나 잘못된 점을 댓글 달아주시면 바로 피드백하겠습니다!댓글