char* name = "Jack Jack";
위 같은 경우는 불가능합니다.
왜냐하면 Jack Jack은 임시로 만들어진 literal일 뿐인데 여기에다 포인터를 집어넣을 수는 없는 것입니다. 포인터는 메모리의 주소를 가리킬 수 있는 것이기 때문에 Jack Jack이 담길 곳이 없기 때문에 그런 것입니다.
하지만 여기에다 const를 붙여주면 가능합니다.
const char* name = "Jack Jack";
이는 특별히 name을 const로 고정해두면서 가능하게 해주는 것입니다.
const char* name = "Jack Jack";
const char* name2 = "Jack Jack";
cout << (uintptr_t)name << endl;
cout << (uintptr_t)name2 << endl;
위 경우 두개의 주소가 같습니다. 이는 컴파일러가 두 개가 같은 값이니 같은 주소를 써라는 식으로 컴파일러가 작용한 것입니다. 물론 더 복잡한 개념이 있지만 현재 상태에서는 이렇게 아시는 것이 이해하기 편할 것입니다.
만약 name2의 Jack Jack을 바꿔준다면 주소 또한 바뀌게 됩니다.
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;
cout << char_arr << endl;
cout << name << endl;
return 0;
}
이렇게 값이 나옵니다. 처음 배열에는 주소값이 나오면 두번째 세번째는 입력한 값을 똑같이 출력을 해주는데요.
cout에서 문자열은 특별히 처리한다는 것을 아셔야 합니다. 이 문자의 char name이라는 포인터가 들어오면 문자열이 아닐까 생각을 하는 것입니다. 문자의 포인터는 c 스타일의 문자열일 가능성이 높다. 문자의 배열일 가능성이 높다고 생각하고 주소를 출력하는 것이 아닌 NULL을 만날 때까지 ARRAY를 쭉 출력한다고 보면 됩니다.
이것은 cout이 특별히 처리해야 하기 때문에 외워야 하는 문제이긴 합니다. 상식에 맞지 않은 것이기 때문입니다.
char c = 'Q';
cout << &c << endl;
이렇게 나오게 됩니다. 위 같은 경우는 c에 주소가 들어가니깐 문자열인가보다 라고 생각을 하고 문자열을 출력할 때는 NULL 캐릭터가 나올 때까지 계속 찍게 되기 때문에 NULL이 나올 때까지 찍은 것입니다. Q 다음에는 쓰레기값이 나온 것이죠.
* 연산자는 포인터를 역참조하는 연산자이기 때문에 포인터가 가리키는 값을 가져옵니다. 그렇기 때문에 정상적으로 Q를 가져오고 싶으면 포인터가 가리키는 메모리에 저장된 값을 가져오도록 *&c를 써주십면 됩니다.
char c = 'Q';
char *ptr = &c; // 변수 c의 주소를 포인터 ptr에 할당
cout << *ptr << endl; // ptr이 가리키는 메모리에 있는 값을 출력
이 구조를 익히셔야 합니다. 이 구조가 왜 이렇게 되는지 찬찬히 생각해보면 포인터에 대한 개념이 얼추 잡히실 겁니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.13] 포인터와 const (0) | 2024.03.29 |
---|---|
[따배시 6.11] 메모리 동적할당 new와 delete (1) | 2024.03.29 |
[따배시 6.9] 포인터 연산과 배열 인덱싱 (0) | 2024.03.29 |
C++ [포인터 개념 정리] (0) | 2024.03.26 |
벡터의 순회 (0) | 2024.03.25 |