pointer

2022. 4. 2. 01:44C++

> 포인터를 알기 위해선 주소 연산자와 역참조 연산자를 알 필요가 있다.

 

주소 연산자(&)

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

 

역참조 연산자 (*)

역참조 연산자 * 를 사용하면 특정 주소에서 값에 접근할 수 있다. 

 

#include <iostream>
using namespace std;

int main(void)
{
	int x = 3; 
    cout<<x<<endl;	// 3
    cout<<&x<<endl;	// 0x61ff0c
    cout<<*&x<<endl;	//3
    
	return 0;
}

 

포인터

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

 

포인터 선언 

포인터의 선언은 아래와 같다. 

int * ptr1;	//int형 포인터 
double * ptr2;	//double형 포인터
char * ptr3;	//char형 포인터'
std::string * ptr4 //string형 포인터

Tip. 포인터 변수를 선언하는 경우 별표가 각 변수에 포함되어야 한다. 

int * ptr1, ptr2;	//ptr1은 포인터지만 ptr2는 변수다

 

포인터 값 할당

포인터는 메모리 주소를 저장하므로, 포인터의 값은 주소여야한다. 

변수의 주소를 얻기위해서는 주소연산자(&)를 사용한다. 

int value = 4;
int * ptr = &value; //포인터 변수의 자료형은 가리키는 변수의 자료형과 같아야한다.

 

다음은 올바르지 않은 코드다. 

int * ptr = 5;

 

포인터는 주소만 보유할 수 있기 때문이다.

또한 포인터에 메모리주소를 직접 할당할 수 없다. 

double ptr =  0x61ff0c; // 정수를 할당하는 것으로 취급

 

정리하자면 아래와 같다. 

  • ptr은 &value 값과 같다. 
  • *ptr은 value 값과 같다. 

즉 *ptr은 value와 같게 취급된다.

 

배열과 포인터

배열 변수는 배열의 첫 번째 주소를 가지고 있다. 

#include <iostream>

int main(void)
{
	int array[5] = {1,2,3,4,5};
   	std::cout<<array<<std::endl;	// 0x61ff08
    std::cout<<&array[0]<<endl;		// 0x61ff08
    
	return 0; 
}

 

하지만 배열과 포인터는 엄연히 구분된다.

array는 int[5]의 타입이고, 배열에 대한 포인터는 int* 타입니다. 

또한 포인터를 통해 배열의 모든 요소에 접근 가능하지만, 배열길이와 같이 배열 타입에서 얻을 수 있는 정보는 포인터에서 접근할 수 없다. 

sizeof()연산자를 사용하면 배열에서는 배열의 전체 크기를 반환하지만, 포인터에서는 메모리주소의 크기(바이트)를 반환한다.

 

 


출처: https://boycoding.tistory.com/201?category=1009770 [소년코딩]

'C++' 카테고리의 다른 글

new와 delete  (0) 2022.04.03
malloc & free  (0) 2022.04.03
Reference  (0) 2022.04.03
template  (0) 2022.04.02
call-by-reference & call-by-value  (0) 2022.04.02