반응형
& (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만 받아야하는 파라미터가 필요할때 사용)
반응형
'C++' 카테고리의 다른 글
6-4. 포인터 연산, 배열 인덱싱 (0) | 2024.02.20 |
---|---|
6-3. 포인터와 정적 배열 (1) | 2024.02.18 |
6-1. C언어 스타일 배열 문자열(strcpy, strcat, strcmp) (0) | 2024.02.17 |
5-3. C++ std::cin.fail(), std::cin.clear(), std::cin.ignore() 함수 (0) | 2024.02.07 |
5-2. C++ 난수 만들기 (0) | 2024.02.05 |