C++ 참조자
2022. 2. 9. 15:58 - pingu-s
#include <iostream>
using namespace std;
int change_val(int* p) {
*p = 3;
return 0;
}
int main() {
int number = 5;
cout << number << endl;
change_val(&number);
cout << number << endl;
return 0;
}
chanfe_val 함수의 인자 p에 number의 주소 값을 전달하여, *p를 통해 number를 참조함. 그리고 number의 값을 3으로 바꿈.
C언어에서는 어떠한 변수를 가리키고 싶을 땐 반드시 포인터를 사용해야만 했음. 그런데 C++에서는 다른 변수나 상수를 가리키는 방법으로 참조자(reference)를 제공함.
#include <iostream>
using namespace std;
int main() {
int a = 3; //a를 정의하고 3을 대입
int &another_a = a; //a의 참조자 another_a를 정의
another_a = 5; //another_a에 5를 대입
cout << "a : " << a << endl; //a의 값은 사실상 5
cout << "another_a : " << another_a << endl;
return 0;
}
참조자를 정하는 방법은 가리키고자 하는 타입 뒤에 &를 붙이면 됨.
int 형 변수의 참조자를 만들고 싶을 때에는 int&를, double 형 참조자를 만들려면 double&로 하면 됨.
또한 int*와 같은 포인터 타입의 참조자를 만들려면 int*&로 쓰면 됨.
위 코드에서 처럼 another_a는 a의 참조자라고 선언할 수 있음. 이 말은 another_a는 a의 또 다른 이름이라고 컴파일러에게 알려주는 역할을 함. 따라서 another_a에 어떠한 작업을 수행하든 사실상 a에 그 작업을 하는 것과 마찬가지
포인터 vs 참조자
int& another_a; //불가능
int* p; //가능
레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야 한다.
int a = 10;
int& another_a = a; // another_a는 a의 참조자!
int b = 3;
another_a = b; // 불가능!
레퍼런스가 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다.
int a = 10;
int* p = &a; // p는 a를 가리킨다.
int b = 3;
p = &b; // 이재 p는 a를 버리고 b를 가리킨다.
반면 포인터에서는 가능
int a = 10;
int* p = &a; // p는 메모리 상에서 8바이트를 차지하게 됨
int a = 10;
int& another_a = a; // another_a는 a로 바꿔치기 하면 되므로 메모리가 존재X
예제) number의 수 바꾸기
#include <iostream>
using namespace std;
int change_val(int& p) {
p = 3;
return 0;
}
int main() {
int number = 5;
cout << number << endl;
change_val(number);
cout << number << endl;
return 0;
}
출처: 모두의 코드 씹어먹는 C++ // 복습 노트
'개발 > C++' 카테고리의 다른 글
C++ 변수 (0) | 2022.02.17 |
---|---|
C++ 프로그래밍의 기본3 (0) | 2022.02.17 |
C++ 프로그래밍의 시작 (0) | 2022.02.15 |
C++ 프로그래밍의 기본2 (0) | 2022.02.15 |
C++ 프로그래밍의 기본 (0) | 2022.02.15 |