728x90
728x90
SMALL
포인터
메모리 주소를 담는 변수를 뜻한다.
&
- 변수 앞에 붙으면 그 변수의 주소
*
- 포인터 변수 앞에 붙으면 그 포이터 변수가 담고 있는 주소에 담긴 데이터
- 간접 참조
포인터 변수의 선언
포인터 선언시 가리킬 메모리의 데이터 타입 + *
ex) int *, double *
int x = 5;
int * ptr = &x;
*ptr = 7; // x 값이 7로 변한다. x=7 이나 마찬가지.
int * ptr = &x;
- int 타입의 변수의 주소를 담을 수 있는 포인터라는 의미에서 int *
- 포인터 변수 ptr은 int형 변수인 x의 주소로 초기화 됐다.
- 포인터 ptr은 x 를 가리키고 있다.
*ptr = 7;
- ptr은 현재 x의 주소를 담고 있는데 * 를 포인터 앞에 붙이면 x의 데이터를 참조할 수 있게 된다.
- 동시에 x의 값이 7로 바뀐다.
- 포인터 선언시 데이터 타입을 적어줘야 하는 이유는 이렇게 간접 참조할때 어떤 타입으로 값을 가져올지 정보가 필요하기 때문이다.
포인터를 사용하는 이유
- 많은 양의 데이터를 복사할땐 연산 시간도 늘어나고 써야하는 메모리 공간도 늘어난다.
ο 이때 그냥 포인터로 간접 참조하거나 포인터에 주소를 두고 주소 정보만 복사해서 넘기면 내용물들을 복사할 필요가 없게 되어 효율적이다.
포인터의 크기
sizeof$($ptr$)$
- 32 bit 시스템에서는 int * 이든 double *이든 크기는 4byte다.
ο 32bit = 4byte. 4byte의 주소 체계를 쓰기 때문 - 64 bit 시스템에서는 int * 이든 double *이든 크기는 8byte다.
ο 64bit = 8byte. 8byte의 주소 체계를 쓰기 때문
nullptr
- C언어에선 NULL 로 쓰여쓴데 C++에선 nullptr 로 쓰임
- 포인터(주소) 값이 없다는 의미. 즉, 가르키고 있는 대상이 현재 없음. 아무 주소도 담고 있지 않음.
- 다른 것을 가리키고 있지 않은 포인터의 경우 nullptr로 꼭 초기화 해주는 습관을 들이자.
ο if문을 두어 포인터가 nullptr 일 경우 다른 작동을 하게끔 할 수도 있고
ο double * ptr = nullptr
포인터도 변수기 때문에 초기화를 해주지 않으면 쓰레기 값이 들어있기 때문이다.
뜬금없이 이상한 공간을 가리키고 있을 수 있기 때문에..
<cstddef> 의 std::nullptr_t
std::nullptr_t nptr; // 변수 nptr 은 nullptr만 대입될 수 있다.
<csstddef> 라이브러리는 std::nullptr_t 타입을 지원하는데 이 타입의 변수는 nullptr만 담을 수 있다.
728x90
300x250
LIST
'C │ C++ │ C# > C++' 카테고리의 다른 글
C++ Chapter 6.8 : 포인터의 연산과 배열 인덱싱 (2) | 2023.10.15 |
---|---|
C++ Chapter 6.7 : 포인터와 정적 배열 (0) | 2023.09.28 |
C++ Chapter 6.5 : C언어 스타일의 배열 문자열 (0) | 2023.09.03 |
C++ Chapter 6.4 : 정적 다차원 배열 (0) | 2023.08.31 |
C++ Chapter 6.3 : 배열과 선택 정렬 (0) | 2023.08.30 |