[C++] Reference

2019. 10. 5. 16:48·C/C++

 

 

Definition

사전적 의미는 '참조' 

나의 관점에서 DB에서 'alias' 와 상당히 비슷한 느낌을 받았다.

즉 별명을 지어준다는 것

 

When to use

C의 Call by Value, Call by reference 에서 

Call by reference의 parameter로 포인터 변수 (주소값)을 넘겨본 경험이 있을것이다.

포인터 변수도 결국 메모리를 차지한다.

 

근데!!

C++은 마치 Call by Reference처럼

References as function parameters  .. i.e.  함수 내에서 값은 변경 할 수 있으면서(주소에 접근할 수 있으면서)

별도의 메모리 할당이 없다는 장점이 있다.

 

※ 레퍼런스는 한 번 초기화 되면 다른 변수의 별명이 될 수 없음.

* operloading some operators like ++
* accessed by dot operator('.')
* passing the argument in the copy constructor

 

Differences between Reference and Pointer

  Refenrece Pointer
void Pointer X O
Indirection level just one single, double.. triple ...
when to use In function as parameters and return types passing NULL-pointer
To implement data structures in C++
(Java reference operate as copy constructor default)

Operation

reference는 컴파일 시에 원래 가리키던 변수의 주소값으로 치환된다. 

(*(주소값) 으로)

 

 

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void changeValue(int &ref) // &는'주소'를 가리키는 기호 
//내부적으로 int& ref = a 라는 문장이  수행됨. 
{
    ref = 777;
}
 
int main(void)
{
    int a = 333;
    std::cout << a << std::endl;
    changeValue(a);
    std::cout << a << std::endl;
    
    return 0;    
}
 

 

실행 결과창 '-'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
    int a = 333;
    std::cout << a << std::endl;
    changeValue(a);
    std::cout << a << std::endl;
    std::cout << ref << std::endl; << 요놈을 추가한다면?!
    return 0;    
 

std::cout << ref << std:endl;

레퍼런스를 출력하려고 했는데

다음과 같은 에러가 난다.

 

[Error] 'ref' was not declared in this scope

 

1
2
3
4
void changeValue(int &ref) 
{
    ref = 777;
}

보면 changeValue라는 함수는

ref라는 레퍼런스를 생성하고 

4번라인의 '}'를 만나는 순간 사라진다.

 

 

 changeValue(a); // 요 라인에서 다음라인으로 넘어가는 순간 ref는 존재하지 않는다.

 

 

(이 설명은 함수나 변수가 어떻게 메모리에 잡히는지 알고있어야 이해할 수 있다..

우리가 C / C++ 같은 언어를 배우면서 익혀야할 것은 이런 메모리상에서 일어나는 일들을 이해하는게 아닌가 싶다..)

 

 

5. Memory Map

얼핏 보면 change Value에서 REF라는 변수를 선언하고 a 값을 복사해온것 같지만 사실상 이 함수내에서 한 일은

ref라는 레퍼런스가 a의 주소를 가리키게 한 것 , 그리고 a의 주소로 접근하여 777이란 값을 대입해준 것이 다다.

(다시 말하지만, 포인터 변수도 주소를 가리키지는건 동일하지만 차이점은 Reference의 경우 별도의 메모리 공간을 차지하지 않는다는 것이다.)

 

또한, changeValue 로컬함수의 수행이 '}'을 만남으로써 끝나면 Reference 설정도 해제되기 때문에.. 

main 함수 <-> changeValue간 Scope 차이로 인해서

ref를 출력하려고하면 오류가 나는것!

 

 

 

 

 

[추가 예제]

Function of Return Reference 

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
#include <iostream> 
 
using namespace std;
 
 
    int fn1(int &a)
    {
        return a;
    }
    // return 이 단순 int a라는놈 '값' (r-value)  << register 영역 (Read Only, Write XX) 
    int& fn2(int &b)
    // return이 b라는 reference가 참조하는 변수 << x그자체. 
    { 
        return b;
    }
    
    int main(void)
{
    int x = 1;
    cout << fn1(x) << endl;
    cout << ++fn2(x) << endl;
    
    return 0;    
    
}
 

주석 참고 ^ㅡ^

 

결과는 ~ 예측해보소

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

Copy Constructor  (0) 2019.11.20
character array vs String  (0) 2019.11.10
[백준 2752] 세 수 정렬하기  (0) 2019.10.28
[기초 100제] 98번 설탕과자 뽑기  (0) 2019.10.27
[코드업 기초 100제 - 85번] 소리 파일 저장용량 계산하기  (0) 2019.10.07
'C/C++' 카테고리의 다른 글
  • character array vs String
  • [백준 2752] 세 수 정렬하기
  • [기초 100제] 98번 설탕과자 뽑기
  • [코드업 기초 100제 - 85번] 소리 파일 저장용량 계산하기
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Kotlin
    docker
    ubuntu
    JPA
    java
    C++
    algorithm
    PostgreSQL
    백준
    database
    프로그래머스
    javascript
    Spring
    Programmers
    알고리즘
    linux
    kafka
    Git
    android
    Bitcoin
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
[C++] Reference
상단으로

티스토리툴바