인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

hansh4530님의 프로필 이미지

작성한 질문수

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

6.19 다중 포인터와 동적 다차원 배열

동적 변수 질문이요!

작성

·

66

1

int *r1 = new int[col];

이게 사실

int r1;

int *r1 = &r1;

int col = r1;

이거랑 같은건가요?

그래서 int *r1의 int랑 new int[col]의 int랑 타입은 항상 같아야 하구요..?

답변 2

1

Soobak님의 프로필 이미지

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

 

같지 않습니다.

int *r1 = new int[col];

: 여기서 r1포인터(int*)이며, 동적으로 할당된 배열의 첫 번째 원소의 주소를 저장하게 됩니다.

new int[col]int 타입의 배열을 동적으로 생성하고, 배열의 첫 번째 요소의 주소를 반환합니다.

 

반면,

int r1;
int *r1 = &r1;
int col = r1;

: 이 코드는 우선 문법적으로 옳지 않아 컴파일 오류가 발생합니다.

int *r1 = &r1; 이 부분에서, 기존 r1이 이미 정의되었으므로 같은 이름의 변수를 선언할 수 없기 때문입니다.

질문주신 내용의 맥락 상으로 int *r1 = &r1; 가 가능하다고 가정하더라도, col = r1; 부분에서 int* 타입을 int 에 할당하는 것이므로 컴파일 오류 발생합니다.

 

이해를 돕기 위해 동적으로 생성하는 배열이 아닌, 정적 배열에 대한 경우로 예를 들어보자면 다음과 같습니다.

int arr[col]; // 정적 배열 선언
int *r1 = arr; // 배열의 첫 번째 요소의 주소를 포인터에 저장

: arr 은 정적 배열이며, arr 자체가 배열의 첫 번째 요소의 주소를 나타냅니다. r1arr 의 첫 번째 요소의 주소를 가리키는 포인터입니다.

이와 비슷하게, int *r1 = new int[col]; 에서 r1동적으로 생성된 배열의 첫 번째 요소의 주소를 가리키는 포인터입니다.

 

마지막에 질문주신 "int *r1의 int랑 new int[col]의 int랑 타입은 항상 같아야 하는가?" 에 대해서는 옳습니다.

포인터를 통해 배열의 첫 번째 원소의 주소를 가리킬 때, 포인터의 자료형은 배열의 자료형과 같아야 합니다.

0

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

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

질문해주신 내용에 대해 설명드리면, int *r1 = new int[col];는 C++에서 동적 메모리 할당을 사용하여 col 크기의 정수형 배열을 힙(동적 메모리)에 생성하는 코드입니다.

여기서 int *r1은 포인터로, 동적으로 할당된 배열의 첫 번째 요소의 주소를 가리키게 됩니다. 즉, 포인터 r1은 그 배열의 시작 주소를 저장하고 있습니다. 따라서 정의적으로 int r1와는 다릅니다. int r1은 단순히 정수형 변수 하나를 선언하는 것이고, 포인터와는 역할이 다릅니다.

따라서 int *r1 = &r1;와 같은 코드는 위와는 무관한 개념입니다. int *r1new int[col]에 의해 생성된 정수 배열의 주소를 저장하게 되는 포인터입니다.

그리고 맞습니다. 포인터의 타입과 할당하려는 데이터 타입이 동일해야 메모리에서 올바르게 데이터를 다룰 수 있습니다. 따라서 int 타입의 데이터를 저장하기 위해 int * 포인터가 사용됩니다.

관련하여 더 자세히 설명된 질문과 답변이 있는 게시물 링크를 추천해 드립니다:

위 링크를 참고하셔서 동적 메모리 할당과 포인터의 개념을 한 번 더 확인하시면 도움이 될 것 같습니다.

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