readme.md
기록소
readme.md
전체 방문자
오늘
어제
  • 분류 전체보기
    • 네트워크
      • HTTP
      • 윈도우 소켓 프로그래밍
    • Windows API
    • 그래픽스
      • DirectX11
    • 일반
      • Linux
      • 데이터베이스
      • 팁
      • 책 후기
    • 쿠버네티스
    • 프로그래밍 언어
      • C#
      • Java
      • Go
      • C++
      • Lua
    • 책
      • 이펙티브 C++
      • 제프리 리처의 WINDOWS VIA C, C++
    • 기타

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 생성자
  • wm_keyup
  • Delete
  • directx11
  • 템플릿
  • 가상함수
  • 버텍스 버퍼
  • 인터페이스
  • windowsAPI
  • phong
  • consteval
  • DirectX
  • 캐스팅
  • Graphics
  • emplace
  • imagestride
  • C++
  • 소멸자
  • id3d11shaderresourceview
  • 상속
  • 소켓 프로그래밍
  • const
  • 자원관리
  • 설계
  • 윈도우 소켓
  • 대입연산자
  • CPP
  • new
  • 자바8
  • 초기화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
readme.md

기록소

프로그래밍 언어/C++

포인터와 const

2023. 3. 31. 11:33

홍정모의 따라하며 배우는 C++에서 6.13 포인터와 const 정리

1. 포인터

포인터는 값을 저장하는 변수가 아니라 메모리 주소를 저장하는 변수다.

int value = 5;
int *ptr = &value;

// 메모리 주소 출력
cout << ptr << endl;

// 메모리 주소에 저장된 값을 출력
cout << *ptr << endl;

2. const

변수에 const 키워드를 사용하면 해당 변수를 상수처럼 사용할 수 있게 된다. const 키워드가 사용된 변수는 값을 다시 할당할 수 없다.

const int num = 5;
num = 10;        // 컴파일 에러 발생

3. 상수 포인터

포인터 역시 변수이기 때문에 const 키워드와 함께 사용이 가능하다.

int value = 5;
// 상수 포인터
const int *ptr = &value;

상수 포인터의 의미는 해당 포인터 변수가 가리키는 메모리 주소에 저장된 값을 상수처럼 취급하겠다는 의미이다. 따라서 상수 포인터로 역참조(dereference)를 해서 값을 변경하는 행위를 할 수 없다.

int value = 5;
const int *ptr = &value;

// 역참조한 값을 사용하는 것은 가능. 5 출력
cout << *ptr << endl;

// 역참조를 통해 값을 변경하는 행위는 불가능. 컴파일 에러 발생
*ptr = 10;

// value는 변수이기 때문에 값을 변경할 수 있음. 10 출력
value = 10;
cout << *ptr << endl;

재미있는 부분은 상수 포인터에서 가리키는 메모리 주소의 값은 변경이 가능하다. 하지만 역참조를 통해 접근할 수 있는 값은 상수처럼 취급하기 때문에 여전히 변경할 수 없다.

int value = 5;
const int *ptr = &value;

int new_value = 10;
ptr = &new_value;

4. 포인터 상수

포인터 상수는 포인터 변수에 저장된 메모리 주소값을 상수처럼 취급하기 위해 사용할 수 있다.

int value = 5;
int *const ptr = &value;

cout << *ptr << endl;        // 5

int new_value = 10;

// 컴파일 에러 발생. 포인터 상수에 새로운 주소값을 할당할 수 없음
ptr = *new_value;

*ptr = 10;
cout << *ptr << endl;        // 10

포인터 상수는 const 키워드가 붙은 변수처럼 선언과 동시에 초기화를 해야 한다. 또한, 새로운 주소값을 할당할 수는 없지만, 역참조를 통해 접근할 수 있는 값은 상수로 취급하지 않기 때문에 값을 변경할 수 있다.

 

그래서 메모리 주소값과 주소에 저장된 값을 모두 상수처럼 취급하고 싶으면 const int *const ptr = &value와 같은 방식으로 사용해야 한다.

'프로그래밍 언어 > C++' 카테고리의 다른 글

환경설정(vcpkg 설치)  (0) 2023.04.28
함수 오버로딩과 포인터  (0) 2023.04.03
cin과 getline  (0) 2023.03.25
헤더 파일과 소스 파일 나누기  (0) 2023.03.16
LEARN C++ 1.7  (0) 2023.02.16
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • 환경설정(vcpkg 설치)
    • 함수 오버로딩과 포인터
    • cin과 getline
    • 헤더 파일과 소스 파일 나누기
    readme.md
    readme.md

    티스토리툴바