본문 바로가기
C++/기초(두들낙서)

[C++기초] 레퍼런스 변수

by Meaning_ 2022. 1. 11.
728x90
반응형

레퍼런스 변수

 

레퍼런스변수도 포인터랑 비슷한 개념이다. 다만 레퍼런스 변수는 대입된 변수의 값과 주소값을 모두 그대로 가진다. 

얘도 어떤 변수를 가리키고, call-by reference가 가능했다.

그렇다면 포인터랑 다른점은 무엇일까?

 

포인터의 경우 a가 10으로 바뀐다

 

 

레퍼런스 변수의 경우  p=10만 해주면 a가 10으로 변한다.

 

레퍼런스의 대표적인 예시가  swap이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include<string>
using namespace std;
 
void swap(int& a ,int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}
 
int main() {
    
    int a(5), b(7);
 
    swap(a, b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
}
cs

 

 

연습문제

레퍼런스 변수를 사용해 윗줄은 1 2 3 4 5 6 7 8 9 10 아랫줄은 2 3 4 5 6 7 8 9 10 11이 출력되게 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include<string>
using namespace std;
int main() {
    int arr[10= { 1,2,3,4,5,6,7,8,9,10 };
    for (int n : arr) {
        cout << n << ' ';
        
   }
    cout << endl;

    for (int n : arr) {
        cout << n << ' ';
   }
    cout << endl;
}
cs

예를 들어 int n=arr[2]일 때를 생각해보자. n은 개별적인 변수이기 때문에 n을 바꾼다고 해서 arr의 값이 당연히 바뀌지 않는다.

n++을 cout보다 위에 쓴다고 하면 오히려 윗줄에 2 3 4 5 ..11 아랫줄에 1 2 3 ..10 이 나올거다.

 

그렇기에 n값이 arr의 원소를 가리키게 해야한다. 

이때 사용할 수 있는게 레퍼런스 변수다.

 

 

의도한바대로 잘 출력된다. 

 

n이 arr의 원소들을 가리키기 때문에 n++을 했을 때도 arr의 원소들이 1씩 증가하는 것이다! 

 

cf) 포인터를 가리키는 레퍼런스 변수 -> 포인터로 생각 

레퍼런스 변수는 한번 가리키고 있는 값이 더는 바뀌지 않음 

 

수정할 수 없는 값 = r-value

수정할 수 있는 값 = l-value

 

int a=5; 일때 변수 a는 수정할 수 있는 값이기에 l-value이고 숫자 5는 수정할 수 없는 값이기에 r-value이다. 

728x90
반응형

댓글