devdw
bloom_
devdw
전체 방문자
오늘
어제
  • 분류 전체보기 (20)
    • develop (15)
      • 개발기록 (0)
      • Java (5)
      • C++ (4)
      • Spring (0)
      • Database (3)
      • Algorithm (1)
      • etc (2)
    • diary (3)
      • 일기 (0)
      • 🍕🍔🍟 (1)
      • Review (2)
    • works (1)
      • reviews (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 난수생성
  • 머신러닝
  • 길벗
  • Codility
  • 순간접착제
  • SourceCode
  • AI
  • float
  • 코딩테스트
  • Share
  • iteration
  • 변수
  • STAEDTLER NORIS DIGITAL S PAN
  • database
  • 스테들러
  • lesson1
  • array
  • 알고리즘
  • 펜그립
  • xor
  • 신경망
  • PYTHON
  • GIST
  • 스테들러노리스디지털펜
  • 다이소
  • github
  • 신경망 교과서
  • class
  • java
  • 조심또조심

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
devdw
develop/C++

[씹어먹는 C++ - 2] 참조자

develop/C++

[씹어먹는 C++ - 2] 참조자

2021. 9. 1. 15:25

C언어에서 변수를 가리키고 싶을 때 사용하는 것 : 포인터

#include <iostream>

int change_val(int *p){
    *p = 3;

    return 0;
}

int main() {
    int number = 5;
    std::cout << number << std::endl;
    change_val(&number);
    std::cout << number << std::endl;
}

C++에서 변수나 상수를 가리키는 방법 : 참조자(reference)

가리키고자 하는 타입 뒤에 & 붙이기

  • 변수의 또다른 이름 (별명)
  • 정의 시 반드시 초기화 해야함
  • 한 번 정해지면 다른 변수로 참조자를 바꿀 수 없음
  • 일반적으로 메모리 상에 존재하지 않음
#include <iostream>

int main() {
    int a = 3;
    int& another_a = a; // another_a는 a의 참조자

    another_a = 5;
    std::cout << "a: "<< a << std::endl;
    std::cout << "another_a: "<<another_a << std::endl;

    return 0;
}
  • 상수 리터럴을 일반적인 레퍼런스가 참조하는 것은 불가능
// 불가능
int &ref = 4; 

// 가능 - a = 4
const int &ref2 = 4;
int a = ref2; 

장점

  • 불필요한 &와 * 가 필요없어서 코드가 훨씬 간결해짐

레퍼런스의 배열

int a, b;
int& arr[2] = {a, b}; // 불가능
  • C++에서 배열의 이름은 첫번째 원소의 주소값으로 변환될 수 있다.
    → arr[1] 과 * (arr + 1) 은 동일하게 처리됨
  • 주소값이 존재한다 == 메모리 상에 존재한다 는 뜻
  • 참조자는 일반적으로 메모리 상에서 공간을 차지하지 않기 때문에 참조자 배열은 불가능함

배열의 레퍼런스

int arr[3] = {1, 2, 3};
int(&ref)[3] = arr; //ref 가 arr을 참조
  • 참조할 때 반드시 배열의 크기를 명시해야 함

함수와 레퍼런스

변수 a의 값은 b에 복사되고 a는 함수 종료 시 a는 메모리 상에서 사라짐

int function(){
    int a = 1;
    return a;
}
int main() {
    int b = function();
    return 0;
}

레퍼런스 리턴 함수

함수는 a의 참조자를 반환한다. 그런데 변수 a는 함수 종료 시 사라진다.
참조자를 반환하면서 원래 참조하고 있던 a가 사라졌기 때문에 별명만 남겨져 오류를 발생시킨다.
원래 참조하던 것이 사라진 레퍼런스 → 댕글링 레퍼런스

int& function(){
    int a = 2;
    return a;
}
int main() {
    int b = function();
    b = 3;
    return 0;
}

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

[씹어먹는 C++ - 4-3, 4] 복사 생성자, 소멸자, const, static  (0) 2021.09.14
[씹어먹는 C++ - 4-1, 2] 객체지향 프로그래밍, 함수 오버로딩, 생성자  (0) 2021.09.01
[씹어먹는 C++ - 3] 메모리 할당/해제  (0) 2021.09.01
  • C언어에서 변수를 가리키고 싶을 때 사용하는 것 : 포인터
  • C++에서 변수나 상수를 가리키는 방법 : 참조자(reference)
  • 레퍼런스의 배열
  • 배열의 레퍼런스
  • 함수와 레퍼런스
'develop/C++' 카테고리의 다른 글
  • [씹어먹는 C++ - 4-3, 4] 복사 생성자, 소멸자, const, static
  • [씹어먹는 C++ - 4-1, 2] 객체지향 프로그래밍, 함수 오버로딩, 생성자
  • [씹어먹는 C++ - 3] 메모리 할당/해제
devdw
devdw
끄적끄적

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.