별의 공부 블로그 🧑🏻‍💻
728x90
728x170

* 인수와 레퍼런스

 

- 포인터를 함수의 인수로 사용하면 호출자의 변수를 변경할 수 있음.

- 하지만 포인터는 메모리 주소를 직접 다루기 때문에 어려움.

- 레퍼런스(reference) : 변수등으로 초기화한 식별자. 형명 앞에 &를 붙여서 선언함.

 

 형명& 레퍼런스명 = 변수;      // 레퍼런스명에는 식별자를 사용함. 

 

 int a;

 int& rA = a;      // 레퍼런스 rA를 변수 a로 초기화함.

-> 이 코드에서 'rA'가 레퍼런스. rA를 변수 a로 초기화한 것.

 

- 예)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main() {
    int a = 5;
    int& rA = a;  // 레퍼런스 rA를 변수 a로 초기화함.
 
    cout << "변수 a의 값은 " << a << "입니다. \n";
    cout << "레퍼런스 rA의 값은 " << rA << "입니다. \n";
 
    rA = 50;
 
    cout << "rA에 50을 대입했습니다. \n";
    cout << "레퍼런스 rA의 값은 " << rA << "(으)로 변경되었습니다. \n";
    cout << "변수 a의 값도 " << a << "(으)로 변경되었습니다. \n";
    cout << "변수 a의 주소는 " << &<< "입니다. \n";
    cout << "레퍼런스 rA의 주소도 " << &rA << "입니다. \n";                                                                  
 
    return 0;
}
cs

 

-> 레퍼런스 rA의 값과 주소는 변수 a와 완전히 같음.

-> 레퍼런스 rA를 변수 a로 초기화함으로써 rA는 a와 완전히 같아진 것.

 

- 레퍼런스 rA를 사용하여, 이것을 초기화시킨 변수 a를 다룰 수 있음.

- 레퍼런스는 반드시 레퍼런스 대상이 되는 변수로 초기화해 두어야 함.

- 레퍼런스의 선언과 대입을 분리할 수 없음.

 int& rA;

 rA = a;    // 레퍼런스에 대입할 수 없음. 

 

- 레퍼런스는 포인터와 유사한 기능을 가지고 있음.

- 그러나 레퍼런스는 포인터와 엄연히 다른 개념이므로 포인터에 레퍼런스를 대입할 수는 없음.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
using namespace std;
 
// swap 함수 선언
void swap(int& x, int& y);          // void swap(int* px, int* py);
 
int main() {
    int num1 = 5;
    int num2 = 10;
 
    cout << "변수 num1의 값은 " << num1 << "입니다. \n";                                                                 
    cout << "변수 num2의 값은 " << num2 << "입니다. \n";
    cout << "변수 num1과 num2의 값을 교환합니다. \n";
 
    swap(num1, num2);               // swap(&num1, &num2);
 
    cout << "변수 num1의 값은 " << num1 << "입니다. \n";
    cout << "변수 num2의 값은 " << num2 << "입니다. \n";
 
    return 0;
}
 
// swap 함수의 정의
void swap(int& x, int& y) {
    int tmp;
 
    tmp = x;
    x = y;
    y = tmp;
}
 
/*
void swap(int* px, int* py) {
    int tmp;
    tmp = *px;
    *px = *py;
    *py = tmp;
}
*/
 
/* 
 * [출력 결과]
 * 변수 num1의 값은 5입니다.
 * 변수 num2의 값은 10입니다.
 * 변수 num1과 num2의 값을 교환합니다.
 * 변수 num1의 값은 10입니다.
 * 변수 num2의 값은 5입니다.
 */
cs

 

- const 지정자가 붙은 인수는 함수 안에서 그 값을 변경시킬 수 없음.

 void func1(const int* px);

 void func2(const int& x);     // const를 붙이면 함수 안에서 실인수를 변경시킬 수 없음. 

 

728x90
그리드형(광고전용)

'Programming > C++' 카테고리의 다른 글

[STL] getline  (0) 2017.10.20
[STL] ceil, floor, round  (0) 2017.09.23
[STL] sort  (0) 2017.09.22
C++ Character Literals  (0) 2017.09.02
함수 템플릿 (Function Template)  (0) 2017.05.29
함수 오버로드 (Function Overloading)  (0) 2017.05.25
기본 인수 (Default Argument)  (0) 2017.05.25
인라인 함수 (Inline Function)  (0) 2017.05.25
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖