C++/참조자(레퍼런스)

2025. 2. 1. 01:26·C++/개인 공부

참조자(레퍼런스)

C는 포인터만 사용할 수 있었지만, C++은 포인터뿐 아니라, 참조자(reference)방식도 제공한다.

int a = 3;
int& a_ref = a; //a_ref변수는 변수a의 참조자다.

cout << a << endl; //3
cout << a_ref << endl; //3 동일하다.

a_ref = 5;

cout << a << endl; //5
cout << a_ref << endl; //동일하다.

포인터와 레퍼런스는 비슷해 보이지만, 몇가지 차이점이 있다.

1. 레퍼런스는 선언과 동시에 초기화 해야한다.

포인터는 선언만 먼저 해도됨

2. 한번 별명이 지정되면 별명을 바꿀 수 없다.

포인터는 가리키던 주소를 바꿀 수 있음

3. 메모리상에 존재하지 않을 수 있다.

포인터는 일종의 변수이기 때문에, 메모리상에 존재함

int a;
int& a_ref = a; //a_ref는 변수 a의 레퍼런스이다.

이 경우에는, 컴파일러가 a_ref가 쓰이는 메모리공간을 모두 a가 사용하는 메모리 공간으로 대체한다.

int x = 5;
int& y = x;
int& z = y; //x의 레퍼런스를 선언해라와 동치

//따라서 y와 z는 모두 x의 레퍼런스가 된다.

scanf와 cin

C에서 사용하던 scanf는 인자에 &(주소연산자)를 붙여야하지만, cin은 붙이지 않는다.

scanf("%d", &x); //주소 연산자를 붙힘
//하지만
cin >> x; //주소 연산자를 붙히지 않는다.

왜냐면, cin은 인자로 레퍼런스를 받기 때문이다.

레퍼런스의 배열, 배열의 레퍼런스

레퍼런스의 배열은 X

int& ref[3] = {a, b, c} //이건 안된다. 
//레퍼런스는 메모리에 공간을 차지하지 않을 수 있기 때문에

배열의 레퍼런스는 가능

int arr[3] = {1, 2, 3};
int(& ref)[3] = arr;

1. 레퍼런스 리턴 함수

int& func() //참조자를 리턴한다.
{
    int a = 2;
    return a;
}

int main(void)
{
    int b = func();
    b = 3;
}

하지만, 컴파일 오류가 난다.

왜냐면, 변수 a는 지역변수로써 함수가 끝나면 메모리상에서 사라지게 되기 때문이다.

2. 레퍼런트 리턴함수

int& func(int& a)
{
    a = 5;
    return a;
}

int main(void)
{
    int b = 2;
    int c = func(b);
}

func함수는 인자로 레퍼런스를 받고, 레퍼런스가 가리키는 곳의 값을 5로 바꾼다.

func(b)에서는 b를 인자로 전달한다. 즉, 인자로 레퍼런스로 받기 때문에, int& a = b;와 같은 효과를 낸다.

변수 c는 func로 부터 레퍼런스a를 전달받지만, c의 자료형이 int이기 때문에, 레퍼런스a의 값인 5를 받는다.


ps)C/C++를 공부할 때,
공식문서를 찾아보는 습관을 길러야겠다.https://ko.cppreference.com/w/cpp

'C++ > 개인 공부' 카테고리의 다른 글

C++/ 생성자, 기본 생성자, 복사 생성자  (0) 2025.02.04
가상 함수와 오버라이딩  (0) 2023.06.07
'C++/개인 공부' 카테고리의 다른 글
  • C++/ 생성자, 기본 생성자, 복사 생성자
  • 가상 함수와 오버라이딩
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch N
        • Cortex-M N
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Web
      • Linux
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
      • Qualcomm 기업과제
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    피보나치
    rubik pi
    스택
    포인터
    arm
    INIT
    자료구조
    commit
    과속탐지
    커널
    파이썬
    권머현
    Git
    c언어
    aapcs
    동적메모리
    버퍼
    thumb2
    이진 트리
    C++
    ptrace
    Branch
    백준
    Qualcomm
    소수
    순환
    yolo
    파일 입출력
    rubikpi
    rubikpi3
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
C++/참조자(레퍼런스)
상단으로

티스토리툴바