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 : 포인터는 변수의 메모리 주소를 가리킨다.
Uploaded by Notion2Tistory v1.1.0