관리자 글쓰기
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