포인터(Pointer), 레퍼런스(Reference)

dallok97·2022년 4월 13일
0

C/C++

목록 보기
6/6
post-thumbnail

😥 포인터, 레퍼런스


🎯 포인터(Pointer)


📕 포인터란?

데이터 구조의 항목 A가 다른 항목 B의 어드레스를 보유하고 있을 때 A를 B의 포인터라고 한다.
📢 [네이버 지식백과] 포인터 [컴퓨터인터넷IT용어대사전]

포인터는 주소를 저장하는 변수입니다.
주소값을 통해서 메모리에 접근합니다. (간접 참조)

기존의 변수는 값(value)을 저장하는데 비해 포인터는 메모리 공간의 주소(address)를 저장합니다.

코드에서 변수를 선언하게 되면 메모리에 변수가 저장이 됩니다.
그 변수는 메모리에 특정 주소에 저장이 됩니다. 그 주소를 가리키는 것이 포인터입니다.

✍ 포인터 사용방법

int* a;
int * a;
int *a;

이렇게 '*'를 붙이면 됩니다. 위에 나온 것처럼 '*'의 위치는 상관없습니다. 변수 앞에 있으면 상관없습니다.

주소값을 이해하려면 '&' 주소 연산자를 이해해야 합니다.
'&' 뒤에 변수 이름을 적으면, 해당 변수 이름의 메모리 주소값을 나타나게 됩니다.

	int A = 10;
	printf(" %p \n", &A); # %p에서 p는 (p)ointer

이 결과를 보면 긴 숫자(0~9)와 ABCDEF(10~15)가 혼합된 주소값(16진수)을 볼 수 있습니다.
이제 포인터에 주소값을 넣어보겠습니다.

	int *ptr;
	int A = 10;
	ptr = &A;

포인터 변수인 ptr을 선언해주고, int A를 선언하고 10으로 초기화 해주었습니다.
그리고 ptr은 A의 주소값을 저장했습니다.

🔑 ptr에는 숫자 10이 저장이 된 것이 아니라 A의 주소값이 저장이 된 것입니다.

이제 포인터가 가리키는 값을 알아보겠습니다.

	printf("%d", *ptr);

출력 결과는 바로 A의 값인 10 입니다.

📚 정리

  1. 포인터 변수 = 메모리 주소
  2. '&' = 주소 연산자
  3. '&' = 변수에 할당 된 메모리 주소
  4. '*'포인터 변수 = 포인터가 가르키는 '메모리 주소'의 '메모리 값'

📲 레퍼런스(Reference)


📕 레퍼런스란?

어떤 하나의 선언(宣言)된 언어 대상물을 지시하는 언어 구성 요소
📢 [네이버 지식백과] 레퍼런스 [IT용어사전]

레퍼런스(참조자)는 자신이 참조하는 변수를 대신할 수 있는 또 다른 이름(별칭)입니다.
즉, 변수의 별명이라고 볼 수 있는 것입니다.
변수의 이름을 통해서 메모리에 참조합니다. (직접 참조)

✍ 레퍼런스 사용방법

	int a = 10;
    int *Pptr = &a;
    int &Rref = a;

Pptr은 포인터이고, a의 주소값을 가리킵니다.
Rref는 레퍼런스(참조자)이고, a의 별칭입니다.
Rref와 a는 같은 메모리를 참조합니다. (같은 메모리 주소)

🔑 레퍼런스는 선언과 동시에 반드시 초기화되어야 합니다.

❗ 레퍼런스 주의할점

  1. 레퍼런스의 값을 변경해서 원본 값 변경될 때가 있습니다. 이것을 방지하기 위해 레퍼런스 선언 앞에 'const'를 붙여줘서 레퍼런스를 상수화 해줍니다.
  2. 지역변수는 레퍼런스로 리턴해선 안됩니다. 함수가 끝나면 지역변수도 사라져 버리기 때문입니다.


👊 포인터 vs 레퍼런스

📖 예시

void swap(int a, int b)
{
	int temp = a;
    a = b;
    b = temp;
}
int main(void)
{
	int num_1 = 10;
    int num_2 = 20;
    cout << num_1;
    cout << num_2;
    swap(num_1, num_2);
    cout << num_1;
    cout << num_2;
    
 	return 0;
}

😈 출력 결과 = 10201020

void swap(int &a, int &b)
{
	int temp = a;
    a = b;
    b = temp;
}
int main(void)
{
	int num_1 = 10;
    int num_2 = 20;
    cout << num_1;
    cout << num_2;
    swap(num_1, num_2);
    cout << num_1;
    cout << num_2;
    
 	return 0;
}

😁 출력 결과 = 10202010

함수 내에서 외부에 존재하는 변수에 직접 접근을 하기 위해 reference를 사용합니다.

📚 차이점 간단 정리

구분포인터(Pointer)레퍼런스(Reference)
NULL 초기화OX
메모리 공간 소모OX

🔑 Call by reference -> 메모리 공간 소모 X, 값 복사 X
🔑 Call by pointer -> 메모리 공간 소모 O, 값 복사 O



Reference

profile
존중과 배려

0개의 댓글