[C++] const char* str와 char* const str의 차이

2025. 8. 5. 17:59·C++

const char* str와 char* const str는 둘 다 char* 포인터를 사용하는데,

const의 위치에 따라 무엇이 상수(constant) 인지가 달라집니다. 


1. const char* str

const char* str:
"포인터가 가리키는 데이터(char)가 상수"
즉, 값을 바꿀 수 없습니다.

  • 뜻: str은 char를 가리키는 포인터이고, 가리키는 char 값은 바꿀 수 없습니다.
  • 가리키는 값이 상수입니다.

포인터가 가리키는 값을 변경할 수 없습니다.

  • 사용 예: str이 읽기 전용 문자열을 가리키도록 하고 싶을 때

2. char* const str

char* const str:
"포인터 자체가 상수"
어디를 가리키는지는 못 바꿉니다.

  • 뜻: str은 char를 가리키는 포인터이고, 포인터 자체는 바꿀 수 없습니다.
  • 포인터가 상수입니다.

포인터 자체를 변경 할 수 없습니다.

  • 사용 예: str이 항상 같은 메모리 위치를 가리키게 하고 싶을 때

선언 의미

const char* str 가리키는 값이 상수 포인터 이동 O,    값 수정 X
char* const str 포인터 자체가 상수 포인터 이동 X,    값 수정 O

 

 

const char* str char는 const, 포인터는 변경 가능 데이터(read-only): *str 변경 X,    str 변경 O
char* const str 포인터는 const, char는 변경 가능 주소 고정: *str 변경 O ,                 str 변경 X
const char* const str 둘 다 const *str 변경 X,                                   str 변경 X

보너스: const char* const str

  • 포인터도 상수고, 가리키는 값도 상수


 


함수에서 const를 매개변수에 사용하는 이유는 안정성과 명확한 의도 전달을 위해서입니다.
간단히 요약하자면:


const를 매개변수에 쓰는 이유

1. 값이 변경되지 않음을 보장

  • 함수 안에서 절대 바꾸지 않겠다는 약속입니다
  • 실수로 값을 바꾸는 것을 컴파일 단계에서 막아줍니다.

-> msg는 오직 출력용일 뿐, 바꾸지 않겠다는 의도를 명확히 함.


2. 호출자(caller)에게 의도를 전달

  • 이 함수는 매개변수를 "읽기 전용(read-only)" 으로 쓴다는 걸 알려줍니다.
  • 즉, 원본 데이터를 보호하겠다는 뜻.
void processData(const int* data);

-> 호출하는 입장에서도 안심할 수 있음. 이 함수는 data를 변경하지 않습니다.


3. 참조 타입(const T&)에서는 성능 + 안정성

  • 복사 비용 없이 값을 전달하면서, 수정은 막는 안전한 방식입니다.
void showName(const std::string& name);
  • std::string을 복사하지 않고 전달하니까 성능이 좋습니다.
  • const이기 때문에 함수 안에서 name 수정 못합니다. 따라서 안정성이 높습니다.

만약 const를 안 쓴다면?

  • 함수 내부에서 실수로 매개변수를 바꿔버릴 수도 있습니다.
  • 혹은 다른 사람이 코드를 봤을 때, 이 함수가 매개변수를 바꿀 수도 있다는 불안함이 생깁니다.

언제 const 쓰는 게 좋을까?

상황 const 사용 여부

포인터 매개변수 (읽기 전용 용도) const char*, const int* 등
참조로 객체를 전달할 때 const std::string&
간단한 값 타입 (int, float 등) 복사해도 부담 적으니 그냥 값 전달

 

 

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

[C++] 연산자 오버로딩 복습 문제 (클래스부터 생성자, 오버로딩까지 구현해보자)  (6) 2025.08.04
[C++] 2차원 배열 선언과 동시에 초기화 vs 선언된 배열 초기화 : 재초기화 오류  (0) 2025.07.11
[C++] 지역 변수(Local Variable) 이름(변수명)과 전역 변수(Global Variable) 이름(변수명)이 같을 경우: Shadowing에 대해서  (0) 2025.07.11
'C++' 카테고리의 다른 글
  • [C++] 연산자 오버로딩 복습 문제 (클래스부터 생성자, 오버로딩까지 구현해보자)
  • [C++] 2차원 배열 선언과 동시에 초기화 vs 선언된 배열 초기화 : 재초기화 오류
  • [C++] 지역 변수(Local Variable) 이름(변수명)과 전역 변수(Global Variable) 이름(변수명)이 같을 경우: Shadowing에 대해서
바닷속벨루가
바닷속벨루가
바다처럼 넓은 컴퓨터 공부를 재밌고 이해하기 쉽게 알려드립니다. 사랑하고 좋아하는 것에는 빠질 수 밖에 없어
  • 바닷속벨루가
    메론빵개발자
    바닷속벨루가
  • 전체
    오늘
    어제
    • 분류 전체보기 (24) N
      • 스프링 (0)
      • 영어 (2)
      • 2025 일상 (1)
      • C++ (4)
      • 웹 개발 (1)
      • 오토마타와형식언어 (2)
      • Coding Test (3)
        • 백준 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    press reset
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
바닷속벨루가
[C++] const char* str와 char* const str의 차이
상단으로

티스토리툴바