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

조유연/컴퓨터공학전공님의 프로필 이미지
조유연/컴퓨터공학전공

작성한 질문수

[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문

포인터와 메모리 해제 (2)

포인터의 연산

작성

·

200

2

p3=p3+1 을 했을 때 

p3[0]이 0.5를 가리키게 되고 

p3[1]이 0.8을 가리키게 되는 원리가 잘 이해가 가지 않아요.

p3주소가 1만큼 옮겨졌단 뜻인가요?

p3에 포함된 배열들의 위치가 1씩 옆으로 옮겨졋단건가요?

답변 1

2

판다코딩님의 프로필 이미지
판다코딩
지식공유자

p3에 포함된 배열들의 위치가 1씩 옆으로 옮겨졌다는 의미입니다.

단, 보다 엄밀히 말하자면 p3는 double 데이터형이기 때문에 8byte씩 옆으로 옮겨졌다는 표현이 보다 정확합니다.

(당연히 p3의 데이터형을 int로 바꾼다면 4byte씩 옆으로 옮겨지겠죠?)

p3[0]의 주소를 ` X `라 할때, p3 배열의 주소는 아래와 같습니다.

&p3[0] = X

&p3[1] = X + 8byte

&p3[2] = X + 16byte

p3 + 1의 주소는 아래와 같습니다.

&p3[0] = X + 8byte

&p3[1] = X + 16byte

&p3[2] = X + 24byte

저희 예제 상에서,

X에는 0.2, X+8byte에는 0.5, X+16byte에는 0.8이 저장되어 있기 때문에,

연산을 하기 전 p3[0]은 0.2를 가리키게 되고, 연산을 진행한 후 에는 0.5를 가리키게 됩니다.

직접 코드를 만들어 실행해보시면 보다 쉽게 이해가 될 것 같습니다 :)

#include <iostream>

using namespace std;

int main() {

    double* p3 = new double[3];
    p3[0] = 0.2;
    p3[1] = 0.5;
    p3[2] = 0.8;

    cout << "p3[0] is " << p3[0] << " at " << &p3[0] << endl;
    cout << "p3[1] is " << p3[1] << " at " << &p3[1] << endl;
    cout << "p3[2] is " << p3[2] << " at " << &p3[2] << endl;

    p3 = p3 + 1;

    cout << "p3[0] is " << p3[0] << " at " << &p3[0] << endl;
    cout << "p3[1] is " << p3[1] << " at " << &p3[1] << endl;
    cout << "p3[2] is " << p3[2] << " at " << &p3[2] << endl;

    p3 = p3 - 1;
    delete[] p3;

    return 0;
}
조유연/컴퓨터공학전공님의 프로필 이미지
조유연/컴퓨터공학전공

작성한 질문수

질문하기