C++ Chapter 6.9 : C언어 스타일의 문자열 기호적 상수

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


char*char []의 차이에 대하여

char name [] = "Jack Jack";  // ⭕가능. 문자열 상수로 char 배열 초기화.
char * name = "Jack Jack";  // ❌불가능! ! 오류 ! !
char * ptr = name;  // ⭕가능. ptr로 name 배열의 원소에 접근 가능.
const char * name = "Jack Jack"; // ⭕가능. const 붙으면 가능해진다. 
  • char name [] = "Jack Jack";: 문자열 리터럴 상수 “Jack Jack”으로 char 배열을 초기화 한다.
  • char * name = "Jack Jack";가 안되는 이유
    • name은 포인터기 때문에.
    • “Jack Jack”은 주소가 아닐 뿐더러 리터럴 상수이므로 포인터처럼 사용하려고 하면 오류가 난다.
  • const char * name = "Jack Jack"
    • const를 붙이면 상수로서 char *도 특별히 문자열로 ***초기화***가 가능해진다.
    • const가 붙은 포인터이므로 “Jack Jack”문자열의 원소값을 간접참조로 바꿀 수 없다. 읽기만 가능하다.


const char *

#include <iostream>

using namespace std;

int main()
{
	const char *name = "jack jack";
	const char *name2 = "jack jack";

	cout << (uintptr_t)name << endl; // 14322480
	cout << (uintptr_t)name2 << endl; // 14322480 놀랍게도 두 주소값이 같다. 

	return 0;
}

namename2의 값은 같다. 즉 문자열 리터럴 상수의 내용이 전부 같으면 같은 메모리로 준다.

const char * getName(){
    return "Jack Jack";
}

위와 같이 리턴 타입으로도 넣을 수 있다. const만 붙이면 char 포인터의 문자열 상수 초기화도 애초에 가능하니까. 리턴되는 “Jack Jack”의 타입은 const char *


cout과 문자열

int main()
{
  int int_arr[5] = {1, 2, 3, 4, 5};
  char char_arr[] = "Hello, World!";
  const char * name = "Jack Jack";

  cout << int_arr << endl;  // 006FF800 출력. 주소가 출력된다.
  cout << char_arr << endl; // "Hello, World!" 문자열 출력.
  cout << name << endl; // "Jack Jack" 문자열 출력
}
  1. char [] 배열
  2. char * 포인터

을 출력하면 int * 포인터 출력할 때처럼 주소값 그대로를 출력하는 것이 아닌 문자열 내용을 출력한다.

  • \0까지 출력한다.
char c = 'Q';
cout << &c << endl; // Qㅇ저ㅑㅐ어재ㅑㅓㅐ어ㅑㅁ 이런 이상한 값이 출력된다.

Q만 잘나오고 뒤에는 계속 쓰레기 값이 나오는 이유는 cout 은 char [] 혹은 char * 을 만나면 \0을 만날 때 까지 문자열 내용을 출력해주는데 & c를 만나 char * 타입의 주소인줄 알고 \0까지 출력해줄라고 했더니만 \0이 안나와서 계속 출력하느라고 그런 것.


'’와 ““의 차이

print('a'); // char 혹은 int
print("a"); // 문자열. const char * 혹은 string 혹은 cahr [] 배열

'' 작은 따옴표는 문자고 "" 큰 따옴표는 문자열이다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기