2차원 배열에서의 주소
719
작성한 질문수 22
#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]) 에서 정수 자료형 한 개 만큼 건너뛴 위치를 가리키는 포인터입니다.
Export template 안됨
1
21
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
54
3
main 함수에서 왜 int만 선언이 되는걸까요
1
56
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
54
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
49
1
프로토타입과 함수간의 인자 불일치
1
73
2
12.12 헤더 관련 질문
1
60
2
Visual Studio Community 2026 사용 문의
1
138
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
61
2
getchar(), putchar()
1
93
3
강의자리ㅛ
1
80
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
114
2
소스파일안에 여러 파일
1
76
2
F5와 F7의 차이
1
77
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
70
1
Step over 기능 문의
1
53
2
2.6 강의 따옴표 출력 규칙 문의
1
75
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
61
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
65
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2





