작성
·
582
·
수정됨
1
#include <stdio.h>
int main()
{
int arr[2][3] = { {1,2,3}, {4,5,6} };
printf("%u %u %u %u %u", arr+1 ,arr[1], &arr[1], &arr[0]+1, arr[0] + 1);
return 0;
}
강의 4:50 화면을 보면서 궁금한게 있습니다.
arr == arr[0] == &arr[0]이고
arr+1 = &arr[1] == &arr[0]+1이므로
arr[0]+1또한 arr+1 = &arr[1] == &arr[0]+1과 같은 주소값을 출력할거라 생각했는데 arr[0]+1을 출력하니 &arr[0][1]이 출력되었습니다.
Q1. 그 이유가 무엇인가요?
강의 3:18에서 arr[0]가 두번째 인덱스가 붙는 배열의 이름이라고 하셨는데 그러므로 arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 되고 arr[0] +1은 포인터연산에 의해 데이터 2의 주소를 가리키는 포인터가 되는건가요? 제가 제대로 이해한게 맞을까요?
Q2. 그렇다면 2차원 배열 arr[2][3] = {{1,2,3},{4,5,6}}에서
arr은 {{1,2,3},{4,5,6}}의 첫번째 원소{1,2,3}의 주소를 가리키는 포인터인데 첫번째 원소가 {1,2,3}이므로 이중포인터가 되는것이고, arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 맞나요?
굉장히 헷갈리고 어지럽네요...
감사합니다.
답변 2
2
안녕하세요, 답변 도우미 Soobak 입니다.
질문하신 내용에 대해서 모두 정확하게 이해하고 계십니다.
질문 1) arr[0] + 1이 &arr[0][1]을 가리키는 이유에 대해서
: 말씀하신 내용이 맞습니다.arr[0]
은 arr
배열의 첫 번째 차원(행)을 나타냅니다. 따라서, arr[0]
의 자료형은 int[3]
입니다.
이 때, 배열의 이름은 주소로 해석될 때 첫 번째 요소의 주소를 나타내므로, arr[0]
은 &arr[0][0]
과 같습니다.
그러므로, 포인터 연산 arr[0] + 1
을 수행하면, 다음 int
값, 즉, &arr[0][1]
을 가리키게 됩니다.
질문2) 2차원 배열에서 arr과 arr[0] 의 관계에 대해서
: 이 또한 옳게 이해하고 계십니다. arr
은 첫 번째 차원(행) {1, 2, 3}
의 주소를 가리킵니다. 따라서, arr
은 int(*)[3]
자료형의 포인터입니다.
즉, arr
은 3
개의 int
요소로 구성된 배열을 가리키는 포인터이며, arr + 1
은 두 번째 차원(행) {4, 5, 6}
을 가리키게 됩니다.
전반적으로, 배열의 이름이 주소로 해석될 때 어떤 자료형의 포인터로 해석되는지에 대해서 잘 이해하고 계시며, 추측을 진행하는 과정도 모두 올바르십니다.
더 자신감을 가지셔도 좋을 것 같습니다.
추가적으로 각 변수들의 자료형과, 배열의 이름으로서 주소로 해석될 때 (C
언어에서 배열의 이름은 그 배열의 첫 번째 원소에 대한 포인터와 호환이 되어 사용되므로) 의 자료형을 요약하면 다음과 같습니다.
arr
- 자료형 : int[2][3]
, 2 x 3
크기의 정수 2차원 배열입니다.
- 주소 자료형 (포인터 연산 시 사용) : int(*)[3]
(1차원 배열에 대한 포인터),
arr[0]
- 자료형 : int[3]
, 3
개의 정수를 갖는 1차원 배열입니다.
- 주소 자료형 (포인터 연산 시 사용) : int*
(요소에 대한 포인터)
&arr[0]
- 자료형 : int(*)[3]
, 3
개의 정수를 갖는 1차원 배열에 대한 포인터입니다.
arr[0] + 1
- 자료형 : int*
, arr[0]
의 첫 번째 원소(즉, arr[0][0]
) 에서 정수 자료형 한 개 만큼 건너뛴 위치를 가리키는 포인터입니다.
1