[C++] Pointer vs Reference

2021. 2. 11. 19:04Study/C&C++

Pointer vs Reference

보통 C 언어에서 변수를 가리킬땐 포인터를 사용 했다. C++ 에선 포인터 와 함께 레퍼런스(참조자) 라는 개념이 도입됬는데 그 둘의 특징과 차이점을 알아보자.


Pointer 

사용자가 접근하고 싶은 메모리의 주소를 담는 하나의 변수(Varilable) 이다.

그러므로 자기 자신의 주소를 가지고 있다. 어떤 자료형이든 고정된 크기를 가진다

32bit 시스템 - 4byte, 64bit 시스템 - 8byte

de-reference operator를 이용하여 직접 적으로 가리키고 있는 메모리에 들어가 값을 다룰 수 있다.

(* , 클래스나 구조체 에선 ->)

 

Reference

사용자가 선언해둔 변수에 새로운 별명(aliance) 이다.

따로 de-refrence operator 없이 일반 변수 사용 하듯이 사용 하여 값을 다룰 수있다.

별명의 개념 이므로 특별한 경우 메모리상 존재하지 않는다. 자신이 참조하는 그 변수에 종속된다.

 

 

차이점 

1.변수에서의 차이

Pointer 는 초기화가 필요없다, 그후 =연산자로 다른 주소를 넣어주며 재할당이 가능하다 

int x = 1;
int y = 2;
int *ptr;
ptr = &x;
ptr = &y;
*ptr = 10; // de-referencing

Reference 는 선언과 동시에 초기화를 해주어야 한다.

한 번 어떤 변수를 참조 했다면, 다른 변수를 참조할 수 없다. 변수에 = 연산자를 쓰는것과 같다.

int x = 1;
int y=2;
//int& rx; 
int& rx = x; 
int& ry = y;
rx = y; //x = y (x의 값을 y에 넣음)

2. 함수인자로 쓰일때 

void func1(int *p)
{
	*p =3;
}
void func2(int& f)
{
	f=3;
}
int main()
{
	int x =1;
    func1(x);
    func2(x);
}

두 함수 모두 x에 3을 대입하는 같은 함수이지만 내부적으론

 

Reference는 변수가 통채로 넘어오는것과 같다. 바로 접근하여 사용된다.

Pointer 는 새로 함수 내부에서 쓰일 변수를 할당받고 x의 주소가 p에 복사된후 사용된다. 

 

3. 함수 인자로 배열을 받을시

fucn1(int(&arr)[1])
{ }
func2(int arr)
{ }
int main()
{
	int arr1[1] = {0};
    int arr2[2] = {0,1};
    func1(arr1);
    func1(arr2); // error
    func2(arr1);
    func2(arr2);
}

이와같이 인자에 배열에 대한 Reference 로 받을 시에는 전달해 주는 배열과, 인자가 크기, 형식이 같아야 한다. 

Reference 는 이미 존재하는 메모리에 대한 별명 이기 때문이다.

 

하지만 Pointer는 주소를 가진 변수 이므로 어떤 인자가 들어와도 형식만 같으면 문제가 되지 않는다.

Pointer 변수를 선언하고 인자로 넘어온 주소값을 넣어주면 되기 때문이다.

 

요약

1.변수는 메모리에 공간을 차지하고 있다.

2.포인터는 변수다

3.레퍼런스는 변수의 이름이다.

 

 

 

'Study > C&C++' 카테고리의 다른 글

[C++] std::cin, getline()  (0) 2021.02.22
[C++]R-value Reference,move Sementics  (0) 2021.02.20
[C++] l-value,r-value  (0) 2021.02.14
[C++] C -style string , std::string  (0) 2021.02.11
[C++] Stack and Heap(feat. Memory Leak)  (0) 2021.02.11