C++/C++ : Study

C++ 포인터 참조자 (7) 포인터 vs 참조자

더블유제이플로어 2024. 9. 25. 23:44

 


Pointer vs References 

중요한 Part이다.

◆  간단 정리

  ● *의 사용

       ☞ 변수를 정의할 때 붙는다? => 포인터의 정의 ( 포인터 변수의 생성 ) int* a

        ☞ 변수를 사용할 때 붙는다? => 포인터의 역참조 *a

  ● &의 사용

       ☞ 변수를 정의할 때 붙는다? => 참조자의 정의 ( 참조자의 생성 ) int& b

        ☞ 변수를 사용할 때 붙는다? => 변수의 주소값 반환 &a

#include <iostream>
using namespace std;
int add(int, int&);
int main()
{
	int age;
	cin >> age;

	int& c = age;
	add(age, c);
	cout << c << endl;
}
int add(int a, int& b)
{
	b++;
	return 0;
}

개념이 이해가 안 간다면 직접 타이핑해서 기억할 것


Pointer vs References 

◆  Pass-by-value

void func(int a)

  ● 함수가 실제 매개변수를 수정하지 않는 경우 사용한다.

  ●  int, char, double과 같은 크기가 작은 기본 자료형의 전달한다

       ☞ 기본 자료형이 아닌 자료형? => string , vector , class

       ☞ 복사의 비용이 높기 때문이다.


◆  포인터를 사용한  Pass-by-address

void func(int* a)

  ●  함수가 실제 매개변수를 수정해야 하는 경우

       ☞ 즉, 지역 범위 밖의 메모리에 저장된 값을 수정해야 하는 경우

  ●  복사의 오버헤드가 클 때  (복사 비용이 작다.)

  ●  포인터가 nullptr이 되어도 상관없을 때

       ☞ 참조자는 null이 될 수 없다.

함수 인자에 null을 넣어줘도 사용 가능하고 싶다면 함수 인자를 포인터로 사용한다.


◆  포인터를 사용한  Pass-by-address

void func(const int* a)

  ●  함수가 실제 매개변수를 수정하지 않는 경우

  ●  복사의 오버헤드가 클 때

  ●  포인터가 nullptr이 되어도 상관 없을 때

       ☞ 참조자는 null이 될 수 없다.


◆  const의 const인 포인터를 사용한 Pass-by-address

void func(const int* const a)

  ●  함수가 실제 매개변수를 수정하지 않는 경우

  ●  복사의 오버헤드가 클 때

  ●  포인터가 nullptr이 되어도 상관 없을 때

       ☞ 참조자는 null이 될 수 없다.

  ●  포인터가 바뀌지 않아야 한다.

const 포인터는 참조자가 있기 때문에 그렇게 많이 사용되진 않는다.


◆  참조자를 사용한 Pass-by-reference

void func(int& a)

  ●  함수가 실제 매개변수를 수정하는 경우

  ●  복사의 오버헤드가 클 때

  ●  포인터가 null이 되지 않는 것이 보장될 때

심지어 4byte 공간도 차지하지 않는다. 그렇기에 복사 비용이 작다.


◆  const 참조자를 사용한 Pass-by-const-reference

void func(const int& a)

  ●  함수가 실제 매개변수를 수정하지 않는 경우

  ●  복사의 오버헤드가 클 때

  ●  포인터가 null이 되지 않는 것이 보장될 때


많이 사용되는 const 참조자 문법이다.

function 안에서는 main 함수 안에 있는 변수를 바꾸지는 않지만,

매개변수 복사값이 커서 메모리에 부담이 갈 때 const 참조자를 사용한다.

value로 넘겨줄 때는 함수 안에서 값을 안 바꿀 거고 크기가 작을 때

포인터로 넘겨줄 때는 함수 안에서 범위 밖의 값을 바꿀 예정 일 때

참조자로 넘겨줄 때는 함수 안에서 범위 밖의 값을 바꿀 예정 일 때

const 참조자는 범위 밖의 값을 바꾸지 않지만 데이터가 커서 값 복사하고 싶지 않을 때

포인터와 참조자를 넘겨주는 기준이다.


(Summary) References

◆  복습 ( &, 변수의 별명, pass-by-reference )

◆  l-value와 r-value (주소값을 가질 수 있는 변수(l-value)가 참조자 생성 가능)

◆  포인터 vs 참조자

  ● pass-by-value

  ● pass-by-reference

       ☞ Pointer

       ☞ Pointer to const

       ☞ const pointer to const

       ☞ Reference

       ☞ const reference


다음 강의부터 객체 지향 강의 OOP를 진행할 예정이다.

클래스와 객체..

C++강의인데 포인터에 집중한 이유

포인터를 알아야 뒤의 내용을 이해할 수 있다.

(기대된다)

교수님 강의 잘 들어 포인터 개념과 활용에 대해 많이 배울 수 있었다.

https://youtu.be/w-LOogaQ01I?si=lK-Z99_xk2CpqqQp