어떤 메모리가 생성되면 그 메모리는 위치(주소), 크기, 형태, 값을 무조건 가지고 있다.
예를 들어 지역 변수 int a = 10; 이라면 아래와 같이 설명할 수 있을 것이다.
위치 : 스택의 어딘가
크기 : 4바이트
형태 : int형 (정수형)
값 : 10
문자를 담는 char형 변수나, 정수를 담는 int형 변수처럼 어떠한 메모리의 주소를 담을수 있는 '변수' 또한 존재하는데, 이를 포인터(Pointer)라고 한다.

포인터 변수의 선언
포인터는 어떠한 메모리 구역의 주소를 가리키고 있는 형태이다. 만약 내가 int의 자료형에 포인터를 붙인다면, 그 자체로 하나의 자료형이 되며 int 포인터형이라고 말한다.
포인터형에는 주소값이 담길 뿐, 포인터 변수도 결국 메모리를 차지하는 하나의 변수라는 것이다.
- 참조형.
- 기본적으로는 같은 자료형의 주소만 저장할 수 있다.
(int* 형에는 int형 변수의 주소값만, char*형에는 char형 변수의 주소값만 )
- 32bit 운영체제에서는 4byte, 64bit 운영체제에서는 8byte의 크기를 차지한다.
- 가리키는 주소값을 바꿀 수 있고, null을 통해 메모리상의 어떠한 값도 가리키지 않을 수 있다.
- 배열의 주소값 또한 저장 가능하다.
(배열의 첫번째 인덱스의 주소값을 저장한다.)
int a = 0;
int* ptrA = &a; // int포인터형 변수의 선언과 초기화
*ptrA = 10; // 포인터의 사용 (역참조)
위와 같이 포인터 변수명에 *을 붙여서 사용하는 문법을 역참조라고 한다.'이 포인터 변수가 가지고있는 주소에 접근 하여 간섭 하겠다.' 는 문법이다.
ptrA가 가지고 있는 a의 주소값에 접근하여, a가 가지고 있는 값에 직접적인 영향을 미치겠다는 뜻이다.
*ptrA = 10; 은, a = 10; 과 같은 의미이다.
레퍼런스(Reference)도 포인터 처럼 주소값을 담는 변수이며, 자신이 참조하고 있는 변수의 또 다른 이름이 되는 문법이다. '항상 *달려있는 포인터와 같다'고 생각하면 된다.
하지만 말 그대로 어떠한 변수의 별명이 되는 문법이라 비어있을 수 없기 때문에 선언과 동시에 초기화 해줘야 한다.
포인터와 레퍼런스의 차이점은 ,
- 레퍼런스는 참조하는 변수를 바꿀 수 없다. 즉, 선언과 동시에 참조하기로 한 변수가 결정되면 계속 그 변수의 별명만 될 수 있다는 뜻이다.
- 레퍼런스는 항상 다른 변수의 별명이 되어야 하므로 존재하고 있는 메모리 영역만을 담을 수 있다. 따라서 포인터처럼 nullptr을 참조하는 것은 불가능하다.
int a = 0;
int b = 0;
// 레퍼런스의 선언과 초기화
// ref는 이제 다른 변수의 별명이 될 수 없다.
int& ref = a;
// a = 10; 과 같음
//레퍼런스가 참조하고 있는 변수 a의 값이 바뀐다.
ref = 10;
// b의 별명이 되겠다가 아닌, ref가 가지고 있는 주소의 값에
// b가 가지고 있는 값을 대입하겠다.
// a = b; 와 같음
ref = b;
int& ref2 = nullptr; // 불가능
예전에 정리했던 포인터와 레퍼런스 관련 글을 가져와봤다...