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
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    소수
    Qualcomm
    시스템콜
    C++
    피보나치
    파일 입출력
    커널
    버퍼
    commit
    이진 트리
    rubikpi3
    백준
    자료구조
    arm
    리눅스
    스택
    순환
    앤드류모튼
    rubik pi
    동적메모리
    커널 기여
    드라이버 분석
    yolo
    파이썬
    토발즈
    Branch
    Git
    포인터
    c언어
    INIT
  • 최근 댓글

  • 최근 글

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

티스토리툴바