참조변수 Reference variable
꼭 포인터를 사용하여 *을 사용하지 않고 참조변수 &를 사용할 수 있다.
참조변수는 참조하고 있는 변수의 주소를 공유한다.
즉, 참조는 변수의 또다른 별명처럼 사용할 수 있다.
참조변수는 반드시 초기화를 해야한다(리터럴은 불가능).
함수에서도 참조변수(reference)를 활용할 수 있다.
파라미터를 복사를 할 필요가 없어 빠르다.
또 주소를 전송하기에 함수에서 값을 변경할 수 있다.
#include <iostream>
using namespace std;
void doSomething(int &n)
{
n = 10;
cout << "In doSomething : " << n << endl;
cout << "In doSomething : " << &n << endl;
}
void doSomethingPointer(int *n)
{
*n = 10;
cout << "In doSomethingPointer : " << n << endl;
cout << "In doSomethingPointer : " << &n << endl;
}
struct SubA {
int v1;
};
struct A {
int v1;
SubA subA;
};
int main()
{
A a;
a.subA.v1 = 3;
cout << a.subA.v1 << endl;
//구조체에서 참조를 활용할 수 있다.
int &v1 = a.subA.v1;
v1 = 4;
cout << a.subA.v1 << endl;
int val = 5;
//파라미터로 int자료형을 보내면 복사가 된다.
doSomething(val);
cout << val << endl;
cout << &val << endl;
//파라미터로 참조변수를 보내면 복사가 되지 않는다.
//즉, 값이 변경 가능하다.
doSomethingPointer(&val);
cout << val << endl;
cout << &val << endl;
//포인터에서 참조변수를 사용가능하다.
int *ptr = nullptr;
ptr = &val;
//참조
int &ref = val;
ref = 10;
cout << ref << endl;
cout << val << endl;
//const활용
const int val2 = 3;
//불가능하다.
//int &ref2 = &val2;
const int &ref2 = val2;
return 0;
}
함수에 파라미터로 const 참조변수를 사용하면 편해진다.
그냥 참조변수에 대입하는 값은 L_Value만 가능하다.
const를 사용하면 L_Value만 아닌 연산도 가능해진다.
#include <iostream>
using namespace std;
//참조변수
void doSomething(const int &const a) {
cout << &a << endl;
cout << a << endl;
}
//포인터
void doSomething2(const int *const a) {
cout << a << endl;
cout << *a << endl;
}
int main()
{
int val = 5;
const int &ref = val;
int &ref2 = val;
//포인터,참조변수 두개의 차이
//그냥 참조변수는 L_Value만 가능하다.
//int &ref3_1 = 3 + 4;
const int &ref3 = 3 + 4;
cout << ref3 << endl;
cout << &ref3 << endl;
doSomething(val);
//ref3의 주소값이 인자가 된다.
doSomething(ref3);
doSomething(1 + 3);
//메모리주소,연산전송이 안된다.
doSomething2(&val);
//doSomething2(ref3);
//doSomething2(1 + 3);
return 0;
}
'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글
c++ for-each문 반복문 (0) | 2019.07.29 |
---|---|
c++ 포인터,참조의 구조체,클래스 멤버선택 (0) | 2019.07.29 |
c++ 동적할당배열,포인터와 const (0) | 2019.07.26 |
c++ 메모리 동적할당 new와 delete (0) | 2019.07.26 |
c++ 기본 포인터연산과 배열인덱싱 (0) | 2019.07.25 |