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

yunandy님의 프로필 이미지
yunandy

작성한 질문수

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

6.8 포인터와 정적 배열

포인터 개념 질문드립니다

작성

·

267

0

안녕하세요 교수님 바쁘신데도 직접 답변주셔서 감사합니다.

6.8의 12분14초에 궁금한게 있습니다.

x86을 기준으로 ptr이 포인터이므로

저는 *ptr 과 *(ptr+4) 가 배열의 인접 값이라고 생각하였는데 *(ptr+1)이 다음값이 어떻게 되는건가요?

궁금해서 아래 코드로 써봤는데 각각 주소를 출력할때는

4차이가 맞는데 빼보니까 또 1이라고 합니다. 제가 어떤 개념이 잘못된것인지 궁금합니다. 감사합니다

#include <iostream>

using namespace std;


int main()
{
	int array[5] = { 11,12,13,14,15, };

	int* ptr = array;
	
	cout << *ptr << " " << *(ptr + 1) << endl; // +4를 해야 다음 index로 넘어갈것이라고 생각했는데 1로 넘어감
	cout << (int)&ptr[1] << " " << (int)&ptr[0] << endl;  //주소 차이는4
	cout << &ptr[1] - &ptr[0] << endl; //차이를 찍어보면 1

	return 0;

}

답변 1

0

안녕하세요~ 답변 도우미입니다. 답변은 대부분 제가 드리고 있습니다 :)

이 부분은 다음 강의인 <6.9 포인터 연산과 배열의 인덱싱> 를 공부하시면 이해가 되실 것입니다. 해당 12분 14초 코드도 교수님께서 11:45초에서 다음 강의에서 배울 것인데 미리 보여주시는 것이라고 말씀을 하십니다.

다음 강의에서 자세히 배우실 것이지만 간략하게 설명을 드려보자면 ..

실제 주소값의 차이는 4이지만, 포인터끼리의 더하기(+) 빼기(-)는 좀 특별하게 작동합니다.

ptr 은 int 를 가리키는 포인터이죠. 그러니 ptr + 1 만 해주더라도 그냥 바로 ptr 이 가리키는 곳의 주소에서 int 크기 만큼인 4 를 더한 곳을 리턴하게 되어 있습니다. 실제주소값 + 1, 실제주소값 + 2, 실제주소값 + 3 은 어차피 모두 ptr 이 가리키는 int 데이터의 일부분일테니까요!

포인터끼리의 더하기 빼기 연산은 실제 주소값을 더하기 빼기 하는 것이 아니라, 그 포인터가 가리키는 데이터 크기 단위로 더하기 뺴기를 진행하게 됩니다. 따라서 ptr 이 8byte 크기인 double 데이터를 가리키는 포인터라면 ptr + 2 은 "실제 주소값 + 16" 이나 마찬가지입니다.

다음 강의에서 자세히 배우실것입니다.

yunandy님의 프로필 이미지
yunandy
질문자

감사합니다. 이해됐습니다!! 

yunandy님의 프로필 이미지
yunandy

작성한 질문수

질문하기