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
'C++ > C++ : Study' 카테고리의 다른 글
OOP - (2) 클래스와 객체 (0) | 2024.09.29 |
---|---|
OOP - (1) OOP 개요(배경설명) (0) | 2024.09.28 |
C++ 포인터 참조자 (6) 참조자 (0) | 2024.09.22 |
c++ 포인터 참조자 (1) 개요 (0) | 2024.09.22 |
C++ 포인터 참조자 (5) 포인터의 전달과 반환 (0) | 2024.09.22 |