찬란

포인터(Pointer) 본문

프로그래밍 언어/C, C++

포인터(Pointer)

chan4 2023. 4. 13. 23:34

변수: 값을 보유하고 있는 메모리 조각의 이름

프로그램이 변수를 인스턴스화 할때 사용 가능한 메모리 주소가 변수에 자동으로 할당되고,

변수에 할당된 값은 이 메모리 주소에 저장된다.

포인터는 어떠한 값을 저장하는 것이 아닌

메모리 주소를 저장하는 변수이다.


주소 연산자 (&) (The address-of-operator) = return (주소)

주소 연산자 & 를 사용하면 변수에 할당된 메모리 주소를 확인할 수 있다.

역참조 연산자 (*) (The dereferenece operator) = return (값)

역참조 연산자 * 를 사용하면 특정 주소에서 값에 접근할 수 있다. (이것은 단항 연산자)


포인터 선언 (Declaring a pointer)

자료형* 포인터 이름

int* ptr; // int형에 대한 포인터

double* dPtr; // double형에 대한 포인터

포인터에 값 할당

포인터 = & 변수

int* ptr = &value;
// or

int *ptr;
ptr = &value;

주소 연산자(&)의 반환값은 메모리 주소(0x0012FF7C, 리터럴 값) 이 아니라 주소가 들어있는 포인터이다.


포인터가 자료형을 가져야 하는 이유

 

포인터 사용 시 주의점

할당되지 않은 메모리 위치에 접근하려고 하면, 운영 체제가 프로그램을 종료할 수 있다.

 

 

포인터의 크기 (The size of pointers)

포인터의 크기는 실행 파일이 컴파일된 아키텍쳐에 따라 달라진다.

  • 32비트 실행 파일: 32비트 메모리 주소 사용 => 포인터의 크기는 32비트(4byte)
  • 64비트 실행 파일: 64비트 메모리 주소 사용 => 포인터의 크기는 64비트(8byte)

포인터의 크기는 항상 같다.

 

 

널 포인터 (Null pointer)

포인터를 초기화하지 않으면, 포인터는 기본적으로 어떤 가비지 주소를 가리킨다.

또는 null값을 지정할 수 있다.

null: 포인터가 아무것도 가리키 지 않는다는 것을 의미하는 특수값

int* ptr{0}; // point to null

null 포인터를 역참조하면 대부분 응용 프로그램이 종료됨!!

포인터를 역참조하는 것은 포인터가 가리키는 주소에 이동하여 그 값에 접근

근데 널 포인터에는 주소가 없다... 해당 주소의 값에 접근하려면 어떻게???


NULL macro

int* ptr{NULL}; // 주소 0을 할당한다.

* C++에서는 사용을 피하는 것이 좋다.


nullptr

int* ptr = nullptr;

C++은 암시적으로 nullptr을 포인터 모든 유형으로 변환한다.

nullptr는 암시적으로 정수 포인터로 변환된 다음, nullptr값이 ptr에 할당된다.

이는 정수 포인터 ptr을 널 포인터로 만드는 효과가 있다.


std::nullptr_t (in C++11)

<cstddef> // 헤더에 존재

 

std::nullptr_t 는 nullptr 하나의 값만 가질 수 있다.

어떤 경우에 사용?

nullptr만을 매개 인자로 받는 함수를 사용할 때

void foo(std::nullptr_t ptr){
	// do something
}


int main(){
	foo(nullptr);
}
Comments