반응형
기호적 상수 (Symbolic Constat)
기호적 상수란 특정 상수에 변수처럼 이름을 부여한 것이다.
프로그래밍의 편의성과 소스 코드의 가독성을 높이는 역할을 한다.
#include <iostream>
using namespace std;
const char *getHello() // return type으로도 사용 가능.
{
return "Hello";
}
int main()
{
const char *name = "Olivia";
const char *name2 = "Olivia";
const char *name3 = getHello();
cout << uintptr_t(name) << endl;
cout << uintptr_t(name2) << endl;
cout << uintptr_t(name3) << endl;
while (true)
{
cout << *name3;
name3++;
if (*name3 == '\0')
{
break;
}
}
cout << endl;
return 0;
}
4329848558
4329848558
4329848552
Hello
포인터는 메모리의 주소만 가리키는 것이기 때문에 문자열을 담을 수 없다.
하지만 앞에 const를 붙여주면 기호적 상수처럼 사용할 수 있다.
const를 선언함으로써 메모리를 없애지 않고 액세스를 할 수 있도록 도와주는 것이다.
또 특이한 점은 서로 다른 포인터 name, name2에 똑같은 "Olivia" 문자열을 저장하였더니 같은 주소에 저장되었다.
두개가 같으니까 컴파일러가 같은 주소를 사용하도록 만든 것이다.
이상해 보이는 점
#include <iostream>
using namespace std;
int main()
{
int intArray[3] = { 1, 2, 3 };
char Hello[] = "Hello!!";
const char *name = "Thomas";
cout << uintptr_t(intArray) << endl;
cout << Hello << endl;
cout << name << endl;
return 0;
}
여기서 궁금증이 생길수 있다. int형 배열 intArray를 출력하면 배열은 포인터이기 때문에
주소값이 나오고 Hello도 배열이고, 배열은 포인터니까 주소가 나와야 한다고 생각하게 된다. 마찬가지로
기호적 상수 name도 포인터니까 출력하면 주소가 나올것 같지만...
6097334776
Hello!!
Thomas
주소가 출력된건 int형 배열 뿐이다. 배운걸로 설명할순 없고 cout에서 문자열은 특별히 처리한다고 받아들여야 한다.
cout에서 문자형에 포인터가 들어오면 문자열일 것이라고 일단 가정을 하게 되는 것이다.
이 부분은 예외적으로 이때까지 이론적으로 배운 내용과 맞진 않지만 컴파일러가 우리 편하라고 구현해 놓은 것들이다.
반응형
'C++' 카테고리의 다른 글
6-6. 메모리 동적 할당 (Dynamic Memory Allocation) (0) | 2024.02.20 |
---|---|
6-4. 포인터 연산, 배열 인덱싱 (0) | 2024.02.20 |
6-3. 포인터와 정적 배열 (1) | 2024.02.18 |
6-2. 포인터의 기본적인 사용법, 널 포인터 (0) | 2024.02.18 |
6-1. C언어 스타일 배열 문자열(strcpy, strcat, strcmp) (0) | 2024.02.17 |