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

강진성님의 프로필 이미지

작성한 질문수

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

10.16 다차원 배열을 함수에게 전달해주는 방법

1차원 배열처럼 나타내는 부분을 맞게 이해한건지 모르겠어요

24.07.09 01:41 작성

·

89

1

강의 예시에서의 2차원 배열 data가 있고 int* ptr = &data[0][0]으로 초기화시켰으니 ptr이 나타내는건 2차원 배열의 대표주소가 아닌 2차원 배열의 1행 1열의 원소를 직접 가리키는 것이 맞나요? 제가 이해한 바로는 배열명인 data에 포인터 산술연산을 가해서 1을 더하면 이것은 2번째 행에 해당하는 내부 배열의 대표주소를 가리키는 것이고 ptr에 1을 더하면 그냥 1차원 배열의 다음 원소인 1행 2열의 원소를 가리킨다고 생각하고 있는데 이게 맞는건지 궁급합니다.

답변 2

1

Soobak님의 프로필 이미지

2024. 07. 09. 21:34

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

Q1. 강의 예시에서의 2차원 배열 data 가 있고, int* ptr = &data[0][0] 으로 초기화시켰으니, ptr 이 나타내는건 '2차원 배열의 대표 주소' 가 아닌 '2차원 배열의 1행 1열의 원소' 를 직접 가리키는 것이 맞나요?

: 네, 맞습니다.
int* ptr = &data[0][0]; 으로 초기화하면, ptrdata 배열의 첫 번째 원소인 data[0][0] 의 주소를 가리키게 됩니다.

 

Q2. 제가 이해한 바로는 배열명인 data 에 포인터 산술연산을 가해서 1을 더하면, 이것은 2번째 행에 해당하는 내부 배열의 대표 주소를 가리키는 것이고, ptr 에 1을 더하면 그냥 1차원 배열의 다음 원소인 1행 2열의 원소를 가리킨다고 생각하고 있는데 이게 맞는 것인지 궁금합니다.

: 네, 잘 이해하고 계십니다.

data + 1 과 같이 배열명 data 에 포인터 산술 연산을 통해 1 을 더하면,
data + 1 은 두 번째 행의 시작 주소 data[1] 을 가리킵니다.
반면, ptr + 1 을 수행하면, data[0][1] , 즉, 첫 번째 행의 두 번째 원소를 가리킵니다.

 

만약, 포인터 연산과 결과의 차이에 대해서 혼동이 있으시다면,

다음 내용들을 다시 점검해보시면 이해에 도움이 많이 되실 것 같습니다.

  • 배열의 이름은 포인터와 호환이 되는 형태이다.

  • 포인터 연산은 포인터의 자료형에 따라 다르게 수행된다.

    • dataint data[3][4] 로 선언된 2차원 배열로, 배열의 이름이 포인터로 사용될 때는 int (*)[4] 의 자료형을 갖는다.

    • 반면, ptrint* 로 선언된 포인터이다.

       

 

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 09. 01:46

안녕하세요, 인프런 AI 인턴입니다.

강진성님의 질문에 대해 답변드립니다. 질문하신 내용을 정확히 이해하신 것입니다. int* ptr = &data[0][0];을 사용했을 때, ptr이 가리키는 것은 2차원 배열의 첫 번째 행, 첫 번째 열에 위치한 원소의 주소입니다. 이 때, 포인터 ptr에 1을 더하면(즉, ptr + 1), 메모리 상에서 다음 위치에 있는 원소, 즉 1행 2열의 원소를 가리키게 됩니다. 이러한 방식으로 포인터를 이동시켜 각 원소에 접근할 수 있습니다.

반면, 2차원 배열에서 배열명을 사용할 때, 예를 들어 data + 1을 하게 되면, 이는 첫 번째 행 전체를 건너뛰고 두 번째 행의 시작 주소를 가리키게 됩니다. 배열명은 대표 주소를 가리키기 때문에, 이렇게 포인터 산술 연산을 적용하면 행 단위로 이동하게 됩니다.

다음 링크는 유사한 질문에 대한 답변입니다:
- 2차원 배열의 주소 관련 질문.

해당 답변에서도 2차원 배열을 메모리에서 1차원 배열처럼 취급하여 각 원소에 접근하는 방식에 대해 설명하고 있습니다. 이는 강진성님이 질문하신 내용과 매우 유사하며, 여러분이 이해하신 개념을 잘 반영하고 있습니다. 이 예시는 ptr을 사용해 2차원 배열의 특정 원소에 직접 접근하는 방법을 보여주며, 포인터 산술 연산을 이용한 배열 원소 접근 방식과 일치합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.