인프런 커뮤니티 질문&답변

CJS님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.14 2차원 배열과 포인터

2차원 배열에서의 주소

작성

·

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} 의 주소를 가리킵니다. 따라서, arrint(*)[3] 자료형의 포인터입니다.
즉, arr3 개의 int 요소로 구성된 배열을 가리키는 포인터이며, arr + 1 은 두 번째 차원(행) {4, 5, 6} 을 가리키게 됩니다.

전반적으로, 배열의 이름이 주소로 해석될 때 어떤 자료형의 포인터로 해석되는지에 대해서 잘 이해하고 계시며, 추측을 진행하는 과정도 모두 올바르십니다.
더 자신감을 가지셔도 좋을 것 같습니다.

추가적으로 각 변수들의 자료형과, 배열의 이름으로서 주소로 해석될 때 (C 언어에서 배열의 이름은 그 배열의 첫 번째 원소에 대한 포인터와 호환이 되어 사용되므로) 의 자료형을 요약하면 다음과 같습니다.

  1. arr
    - 자료형 : int[2][3] , 2 x 3 크기의 정수 2차원 배열입니다.
    - 주소 자료형 (포인터 연산 시 사용) : int(*)[3] (1차원 배열에 대한 포인터),

  2. arr[0]
    - 자료형 : int[3] , 3 개의 정수를 갖는 1차원 배열입니다.
    - 주소 자료형 (포인터 연산 시 사용) : int* (요소에 대한 포인터)

  3. &arr[0]
    - 자료형 : int(*)[3] , 3 개의 정수를 갖는 1차원 배열에 대한 포인터입니다.

  4. arr[0] + 1
    - 자료형 : int*, arr[0] 의 첫 번째 원소(즉, arr[0][0]) 에서 정수 자료형 한 개 만큼 건너뛴 위치를 가리키는 포인터입니다.

1

CJS님의 프로필 이미지
CJS
질문자

감사...압도적 감사... 합니다.

CJS님의 프로필 이미지

작성한 질문수

질문하기