C ++ 배열과 포인터 *연산 관련 질문입니다
조회수 831회
#include <stdio.h>
#include <conio.h>
int main()
{
int a[3][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
};
printf("%d", (a + 1));
printf("\n%d", *(a + 1));
_getch();
}
위 코드에서 첫번째 printf의 결과와 두번째printf의 결과가 같게 나오는데,
왜 같게 나오는지 이해가 안되네요.
*(a + 1)의 의미는 "포인터 (a + 1)이 가리키고 있는 번지에 들어있는 값을 읽어라." 인데
그 결과(번지에 들어있는 값을 읽은 결과)가 a[1]의 번지값이었습니다.
즉 포인터 (a + 1)이 가리키고 있는 번지에 들어있는 값은 a[1]의 번지값이다.
다시 말해 (a + 1)는 'a[1]의 번지값을 가지고 있는 무언가'의 번지값을 가지고 있다는 뜻인데....
말이 안되지 않나요? a의 번지에 +1을 했다는 것은 a의 번지에 4*5바이트 만큼 갔다는 뜻인데,
거기에 있는게 'a[1]의 번지값을 가지고 있는 무언가'의 번지값이라뇨.
제가 분명히 뭔가를 잘못 이해하고 있는 것 같은데, 블로그를 읽어봐도 알수가 없네요.
(문장을 헷갈리게 써서 죄송합니다. 근데 제 의문을 표현하려면 어쩔 수 없는 것 같네요.)
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
1차원 배열이라면 다른값이 나왔을 것입니다. 그런데 위에서
a
는 2차원 배열입니다.그래서 다음을 보면
#include <stdio.h> int main(){ int a[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; printf("%d", a[1][2]); //다음과 같이 출력을 합니다. a[1] //그러므로 다음은 포인터 입니다. a[1]=*(a+1) //[]연산자는 다음과 같습니다. a //이것도 포인터 입니다. a+1 //따라서 이것도 포인터 입니다. }
그리고 두 값 모두 처음에서 1*3 떨어진 만큼을 가리키고 있으므로 같은 값을 갖습니다.
보충설명을 하자면 2차원 배열에서는 2개의 *연산자를 써야 합니다.
말이 꼬인것 같은데 이해하셨겠죠?
- 이해못했어요! array[i] 와 *(array + i)가 같다는 것이 1차원 배열에서는 완벽히 이해가 가는데 array[3][5]에서 array[1]과 *(array + 1)이 왜 같은지 모르겠어요. array[1]은 배열의 이름으로써 포인터 상수일텐데 *(array + 1)이란건 포인터 상수에 *연산을 한 거니까 포인터 상수가 아니라 번지에 들어있는 "값"을 의미하는거 아닌가요? 알 수 없는 사용자 2018.2.22 23:22
- 아 []연산자는 오버로딩이 되지 않는 이상 *(a+b)=a[b]입니다 buttercrab 2018.2.22 23:38
- 아.... *(a+1) 연산에 의해 읽혀지는 값이 정수형이 아니라 정수배열형이라는 것을 몰랐네요... 알 수 없는 사용자 2018.2.23 00:33
댓글 입력