본문 바로가기
C++

6-2. 포인터의 기본적인 사용법, 널 포인터

by kwon5346 2024. 2. 18.
반응형

& (address of operator)

모든 변수는 내부적으로 주소를 가진다. 변수가 어떤 메모리 주소에 담겨있는지 알고싶다면 &를 사용한다.
메모리 주소를 담는 변수를 포인터라고 부른다.


* (de-reference operator)

#include <iostream>

using namespace std;

int main()
{
    int x = 5;
    int y = 10;

    int *ptr_x = &x;
    int *ptr_y = &y;

    cout << *ptr_x << endl;  // 5

    return 0;
}

포인터에 저장이 되는 것은 주소이다. 메모리 주소는 데이터 타입과는 상관이 없지만,
포인터가 이 타입을 알고 있어야 하는 이유는 de-referencing을 할 때
어떤 type으로 가져올지 알아야 하기 때문이다.


널 포인터 (null pointer)

포인터의 위험성 중에서 쓰레기 주소값이 들어갔을경우 de-referencing을 시도하게 되면
엉뚱한 곳에서 데이터를 찾게 된다. 이러한 문제를 방지하기 위해 널 포인터를 사용한다.
초기화되지 않은 포인터는 엉뚱한 주소를 포함할 수 있지만,
널 포인터는 메모리상에 어떠한 값도 가리키지 않는다.

#include <iostream>

using namespace std;

void doSomething(double * ptr)
{
    if (ptr != nullptr)
    {
        cout << *ptr << endl;
    }
    else 
    {
        cout << "Null ptr." << endl;
    }
}
int main()
{
    double x = 3.141592;

    double *ptr = &x;

    doSomething(nullptr);

    doSomething(&x);

    doSomething(ptr);

    return 0;
}

C언어 스타일에선 널포인터를 선언할때 0이나 NULL로 초기화해줬지만
최근 C++스타일에선 nullptr을 주로 사용한다.
또는 <cstddef>를 include하면 std::nullptr_t 타입을 쓸수있다.
(널 포인터밖에 못넣는 타입, nullptr만 받아야하는 파라미터가 필요할때 사용)

반응형