Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 포인터 퍼즐: 포인터의 크기를 맞혀보세요

포인터란 무엇인가?

포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 특수한 변수입니다. 포인터의 데이터 타입은 가리키는 대상이 되는 변수의 데이터 타입과 동일해야 하며, 예를 들어 int형 변수를 가리키는 포인터는 int형 포인터가 됩니다.

이번 퍼즐의 핵심은 "사용되는 포인터의 크기"를 정확히 아는 것입니다. 많은 초보 학습자들이 변수 자체의 크기와 포인터의 크기를 혼동하는데, 이 퍼즐은 변수의 크기를 직접 맞혀 보는 방식으로 포인터에 대한 이해도를 점검합니다.

일반적으로 int의 크기는 4바이트이지만, int형 포인터의 크기는 64비트 시스템에서 8바이트입니다. 여기서 중요한 점은 포인터가 어떤 타입을 가리키든 상관없이, 포인터 자체의 크기는 시스템 아키텍처(32비트면 4바이트, 64비트면 8바이트)에 따라 결정된다는 사실입니다.

그럼 이제 C++로 작성된 다음 예제를 통해 여러분의 실력을 직접 테스트해 보겠습니다.

예제 코드

#include <iostream>
using namespace std;
int main() {
    int a = 6;
    int *p = &a;
    int arr[5][8][3];
    int *q = &arr[0][0][0];
    int ans;
    cout<<"the value of a is "<<a<<endl;
    cout<<"predict the size of a ";
    cin>> ans;
    if(ans == sizeof(p)) {
        cout<<"Hurry! your prediction is right";
    } else {
        cout<<"Your Guess is wrong ";
    }
    cout<<"Now try this "<<endl;
    cout<<"arr is a 3D array"<<endl;
    cout<<"predict the size of arr ";
    cin>> ans;
    if(ans == sizeof(q)) {
        cout<<"Hurry! your prediction is right";
    } else {
        cout<<"Your Guess is wrong ";
    }
    return 0;
}

실행 결과

the value of a is 6
predict the size of a 8
Hurry! your prediction is right
Now try this
arr is a 3D array
predict the size of arr 4
Your guess is wrong

결과 분석

첫 번째 질문은 겉보기에는 변수 a의 크기를 묻는 것처럼 보이지만, 실제로 비교되는 값은 sizeof(p), 즉 포인터 p의 크기입니다. p는 int형 포인터이므로 64비트 시스템에서 그 크기는 8바이트입니다. 따라서 8을 입력하면 정답으로 처리됩니다.

두 번째 질문도 원리는 같습니다. arr은 5×8×3 크기의 3차원 배열이지만, 비교 대상은 sizeof(q)입니다. q는 배열의 첫 번째 요소인 arr[0][0][0]의 주소를 저장하는 int형 포인터일 뿐이므로, 배열 전체의 크기(4 × 5 × 8 × 3 = 480바이트)가 아니라 포인터의 크기인 8바이트가 반환됩니다. 실행 결과에서 4를 입력했기 때문에 오답으로 처리된 것입니다.

핵심 정리

이 퍼즐이 전달하는 교훈은 명확합니다. sizeof 연산자를 포인터에 적용하면, 포인터가 가리키는 대상의 크기가 아니라 포인터 변수 자체의 크기가 반환됩니다. 이 개념만 정확히 이해하고 있다면 두 질문 모두 8을 입력해 정답을 맞힐 수 있습니다. 포인터와 배열을 다룰 때 자주 발생하는 혼동이므로, sizeof의 동작 방식을 반드시 기억해 두시기 바랍니다.