• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

21.05.04 18:06 작성 조회수 134

0

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

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

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

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

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

답변 1

답변을 작성해보세요.

4

안소님의 프로필

안소

2021.05.04

안녕하세요 :)

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

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] 로 출력하시면 되는데 어떤 이유로 출력이 안되신건지 알 수가 없네요 ㅠㅠㅠ 위에서 질문주신 부분들 또한 에러가 나진 않는데 질문 글에선 에러가 난다고 말씀하셔서 다른 코드 상황을 알아야 더 제대로된 답변을 드릴 수 있을 것 같아요.

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