프로그래밍/C++

[C++]포인터 기본 개념

FORHAPPy 2021. 9. 24. 11:40

포인터란?

포인터도 그냥 변수이다.

주소값을 저장하는 변수이다.

 

포인터의 형태

 

<포인터 변수의 형태>

자료형* 변수명 = 값; 

여기서 * 은 에스크리터 연산자라고 부른다.

에스크리터 연산자는 포인터 변수를 선언하는 용도로 사용된다.

 

 

<포인터 변수의 선언>

int* ptr; 
int * ptr; 
int *ptr; 

에스크리터 연산자를 어디에 붙이나 상관은 없으나 통일성이 있어야 한다.

 

 

<포인터 변수의 초기화> nillptr

int* ptr = 0; 
int* ptr1 = NULL; 
int* ptr2 = nullptr;

0은 정수이므로 잘 쓰지 않고, 요즘은 nullptr을 많이 사용한다.

 

 

<포인터 변수의 자료형>

float f = 0.f; 
int* ptr = &f;

이렇게 쓰면 안된다. 

포인터 변수에 주소값을 담으려면 포인터 변수를 선언할 때 명시한 자료형과 일치하여야 한다.

즉, int* ptr = &f; 에 대한 해석은 ptr은 int형 을 가리키는 변수다.

절대 int* ptr = &f; 에서의 int는 포인터의 자료형이 아니다. 가리키는 대상에 대한 자료형이다.

 

 

<포인터 변수의 주솟값 저장> &

int* ptr = nullptr; -----------1
int iA = 0; ----------------------2
ptr = &iA;  ---------------------3
cout << &iA << endl; -------4
cout << ptr << endl; --------5
cout << &ptr << endl;-------6

1. 포인터 변수의 초기화 (아무거도 가르키고 있지 않음)

2. int형 변수 iA는 0을 저장하고 있다.

3. ptr은 iA의 주소를 가리킨다.

4. iA의 주소가 출력

5. ptr로 iA의 주소가 출력

6. 주소를 저장하는 변수인 ptr의 주소는 4번, 5번과는 다른 값이 나온다.

 

& 이 연산자는 변수앞에 붙이면 어드레스 연산자라고 부린다. 해당  변수의 주솟값을 반환하는 용도로 사용된다.

 

 

<포인터 변수의 역참조>

*ptr = 5; 

cout << iA << endl;  // 5 출력
cout << *ptr << endl;  //5출력

주소를 저장하는 ptr에 *을 붙이면 가리키는 변수의 실제 값에 접근하게 된다.

여기서 *은 포인터 선언시 사용했던 에스크리터 연산자랑은 다르다.

역참조(dereference) 연산자라고 불린다.

 

 

<포인터의 크기>

cout << sizeof(int*) << endl; 
cout << sizeof(char*) << endl; 
cout << sizeof(long double*) << endl; 
cout << sizeof(short*) << endl; 
cout << sizeof(long long*) << endl; 
cout << sizeof(bool*) << endl; 

포인터의 크기는 32비트 환경에서는 4바이트 64비트 환경에서는 8바이트이다. 

즉, 앞의 자료형은 포인터의 자료형이 아니라는 말!

 

 

 

 

 

 

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 1차원 배열, 배열 포인터, 배열 초기화, 배열 매개변수  (0) 2021.09.24
[C++]포인터 기본 개념2  (0) 2021.09.24
[C++]이동시멘틱_2  (0) 2021.09.22
[C++]이동시멘틱_1  (0) 2021.09.21
[ C++]r-value  (0) 2021.09.19