inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.5 2차원 배열과 메모리

2차원과 1차원 배열은 같은 것인가요??

241

sem50000

작성한 질문수 2

0

int *ptr = arr //>>1차원 배열에서 

int *ptr = &arr[0][0];//>>2차원 배열에서

&연산자나 [][] 이 없으면 에러가 납니다

그런데 값은 정상적으로 출력이 됩니다 왜 그런지 잘 모르겠습니다

또한 2차원 배열 arr[0][0]의 주소를 출력해보려 해도 출력되지 않습니다 이유를 알고 싶습니다 너무 궁금합니다

c

답변 1

4

안소

안녕하세요 :)

테스트해보신 코드과 실행 결과 캡처사진을 첨부해주시면 제가 질문글을 이해하는데 더 도움이 됩니다. 😉

arr 은 int arr[2][3] 이런 2차원 배열로서 선언하신 상태 에서 int *ptr = &arr[0][0]; 👉 이 식에서 & 를 빼거나 [][] 없이 int *ptr = &arr; 로 작성하면 에러가 난다는 말씀이신건가요? 

2차원 배열은 원소가 1차원 배열이라고 생각해주시면 되요. 배열의 배열이 곧 2 차원 배열입니다. 1 차원 배열들이 연속적으로 묶여있는 형태가 2 차원 배열입니다.

우선 & 없는 int* ptr = arr[0][0];  를 테스트해보신 것 같아 설명드리자면 arr[0][0]은 타입이 int 입니다. 이는 arr 의 첫번째원소 (=첫번째 1차원 배열) 의 첫번째 원소(int) 를 뜻합니다. 그런데 int 포인터인 ptr1 에 int 인 arr[0][0] 를 할당하였으니 타입이 서로 맞지 않습니다. 타입이 서로 맞진 않지만 할당이 되긴합니다. 다만, 예를 들어 arr[0][0] 값이 3 이라면 그냥 ptr1 = 3 한 셈이나 마찬가지가 됩니다. 즉, ptr1 은 주소가 3 인 곳을 가리키게되는 것이에요! 런타임 에러가 발생하진 않지만 잘못된 결과를 초래하죠. int 원소값이 주소값으로 되어버렸기 때문입니다.

[][] 없는 int * ptr = &arr; 도 위와 마찬가지입니다. 앞서 말씀드린것처럼 2차원 배열은 1차원 배열의 배열입니다. 예를 들어 int arr[2][3] 이런 2차원 배열은 "크기가 3 짜리인 1 차원 배열 int[3]" 이 원소인 2 크기의 배열이라고 생각하시면 됩니다. 그래서 이때 &arr 의 타입은 int(*)[3] 이 됩니다. int[3] 을 가리키는 포인터라는 뜻이에요. 그래서 int* 인 ptr 과 타입은 맞진 않지만 어쨋든 둘 다 값 자체는 "주소"이니 할당엔 별 문제가 없는 것입니다. 

그리고 arr[0][0] 의 주소는 그냥 &arr[0][0] 로 출력하시면 되는데 어떤 이유로 출력이 안되신건지 알 수가 없네요 ㅠㅠㅠ 위에서 질문주신 부분들 또한 에러가 나진 않는데 질문 글에선 에러가 난다고 말씀하셔서 다른 코드 상황을 알아야 더 제대로된 답변을 드릴 수 있을 것 같아요.

제가 질문자님께서 어떤식의 코드로 테스트하셨고 어떤 에러를 얻으셨는지 알 수가 없어서 혹시 이 답변으로 해결이 되시지 않는다면, 테스트해보신 전체 코드와 에러와 실행 결과 첨부해주시면 다시 도와드리겠습니다. 

Export template 안됨

1

65

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

92

3

main 함수에서 왜 int만 선언이 되는걸까요

1

81

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

77

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

78

1

프로토타입과 함수간의 인자 불일치

1

87

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

171

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

72

2

getchar(), putchar()

1

111

3

강의자리ㅛ

1

93

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

65

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

61

2

11.6 fit_str함수를 구현해 봤습니다.

1

59

2