JLOG

[C++]포인터의 개념과 포인터 변수 선언하기 및 역참조 본문

C++/개념 정리

[C++]포인터의 개념과 포인터 변수 선언하기 및 역참조

정정선선 2021. 4. 11. 19:31

C++를 공부하면서, C에 대한 개념들이 부족하다고 생각했다. 특히 배열을 함수에 넘겨주고 사용할 때, 포인터 개념이 헷갈려서 포인터 개념을 먼저 정리해보기로 했다.

 

'C언어 코딩 도장'의 사이트를 참고하여 공부했고 이 글을 정리했다.

C언어 코딩 도장의 설명이 자세하게 잘 되있기 때문에 여기서 공부하는 것을 추천한다. 이 글은 개인적으로 기록하기 위한 용도로 정리되었다.

포인터 사용하기 : https://dojang.io/mod/page/view.php?id=274

포인터 변수 선언하기 : https://dojang.io/mod/page/view.php?id=275

역참조 연산자 사용하기 : https://dojang.io/mod/page/view.php?id=276

 

변수 메모리 주소 구하기

변수의 메모리 주소를 구할 때는 앞에 &를 붙이면 된다.

#include <iostream>

using namespace std;

int main(void){
    int n = 10;

    std::cout<<"&n"<<&n; // &n : 0x16b20b68c
}

 

 

포인터

포인터 변수에 메모리 주소를 저장한다. 메모리의 특정 위치를 가리킬 때 사용한다.

 

포인트 변수 선언

  • 자료형 *포인터이름;
  • 포인터 = &변수;

 

포인트 변수 선언시에 *의 위치에 대한 차이는 없고, 모두 동일하다고 한다.

int* nPtr;
int * nPtr;
int *nPtr;

이때 int*는 pointer to int 또는 int 포인터라고 읽는다.

 

#include <iostream>

using namespace std;

int main(void){
    int n = 10;
    int *nPtr;

    nPtr = &n; // n의 메모리 주소를 포인터 변수에 저장

    std::cout<<"nPtr : "<<nPtr<<"\n"; // 포인터 변수 주소 출력
    std::cout<<"&n   : "<<&n<<"\n";   // n의 주소 출력
    
}

같은 주소를 가지고 있는 것을 확인할 수 있다. 주소가 8byte이므로, 64bit인 것도 확인할 수 있었다.

 

포인터는 n 변수의 값 10이 저장된 메모리 공간을 가리킨다. 즉, 변수 n이 있는 공간을 가르키게 된다.

 

+참고

sizeof(포인터), sizeof(자료형 *)을 사용해 포인터의 크기를 알 수 있다.

32bit에서 int 포인터와 char 포인터는 4 바이트를 갖고

64bit에서 int 포인터와 char 포인터는 8 바이트를 갖는다고 한다.

 

 

역참조 연산자

포인터 변수는 메모리 주소가 저장 되어 있다. 이때 메모리에 저장된 값을 가져오기 위해 역참조(dereference) 연산자 *를 사용한다.

 

포인터는 변수의 주소만 가리치지만, 역참조는 주소에 접근해 값을 가져온다.

 

#include <iostream>

using namespace std;

int main(void){
    int n = 10;
    int *nPtr;

    nPtr = &n; // n의 메모리 주소를 포인터 변수에 저장

    std::cout<<"*nPtr : "<<*nPtr<<"\n"; // 포인터 앞에 *를 붙임으로서 해당 메모리에 저장된 값을 가져옴
    std::cout<<"n     : "<<n<<"\n";
    
		*nPtr = 20;

		std::cout<<"*nPtr : "<<*nPtr<<"\n"; // 포인터 앞에 *를 붙임으로서 해당 메모리에 저장된 값을 가져옴
}

역참조를 이용해 해당 메모리의 값을 저장할 수 있다.

 

 

 

정리

  • n : 변수 n은 주소를 몰라도 값을 가져오거나 저장할 수 있다.
  • &n : &을 이용해 n의 주소를 구할 수 있다.
  • *nPtr : *를 이용해 포인터 해당 주소에 저장된 값에 접근할 수 있다.
  • nPtr : 포인터는 변수의 메모리 주소를 가리킨다.

 

Comments