찬란
포인터(Pointer) 본문
변수: 값을 보유하고 있는 메모리 조각의 이름
프로그램이 변수를 인스턴스화 할때 사용 가능한 메모리 주소가 변수에 자동으로 할당되고,
변수에 할당된 값은 이 메모리 주소에 저장된다.
포인터는 어떠한 값을 저장하는 것이 아닌
메모리 주소를 저장하는 변수이다.
주소 연산자 (&) (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);
}
'프로그래밍 언어 > C, C++' 카테고리의 다른 글
[C++] 생성자, 복사 생성자, 이동 생성자, 복사 생략 (0) | 2023.04.14 |
---|---|
[C++] 소수점 자리 조절하기 (0) | 2023.04.13 |
포인터와 배열 (Pointer and Array) (0) | 2023.04.13 |
포인터와 const (0) | 2023.04.13 |
이중 포인터 (Pointers to pointers) (0) | 2023.04.13 |