티스토리 뷰

Programming/C언어

[C/C++] 문자열 상수 포인터

Lkt_Programmer 2017. 10. 6. 14:56
반응형

문자열 표현 방식의 이해


문자열을 표현하는 방식에는 크게 두 가지 방식이 있습니다. 하나는 변수로 표현하는 빙식이고, 또 다른 하나는 상수로 표현하는 방식입니다.

 

1
2
3
4
5
int main()
{
    char str[6] = "Hello"// 변수를 활용한 문자열 변수 표현
    char *str2 = "Hello"// 포인터를 활용한 문자열 상수 표현
}

첫 번째는 char형인 str이라는 이름의 배열을 선언하고, 대입 연산자 오른쪽에 선언된 문자열을 할당하고 있습니다. 따라서 str이 저장하고 있는 문자열은 변수가 됩니다.

두 번째 str2는 char형 포인터를 선언하고, 오른쪽에는 "Hello"라는 문자열을 선언합니다. 이는 포인터 str2를 이용해서 문자열 상수 "Hello"를 가리키겠다는 의미가 됩니다. 따라사 str2는 문자열의 첫 문자 'H'를 가르키게 됩니다.

 

char *str2 = "Hello" 문장에서 str2에는 char형 주소 값이 할당 되는 것을 기대하지만 실제로는 "Hello"를 통해 할당을 하고 있습니다. 사실 문자열 상수는 메모리 공간에 저장이 되면 그 순간에 문자열 상수의 주소 값이 반환이 됩니다.

 

똑같은 문자열을 선언하면 한번만 메모리 공간에 할당된다.

 

1
2
3
4
5
6
7
8
int main()
{
    char *str1 = "Hello";            //같은 문자열 상수를 각기 다른 포인터에 할당
    char *str2 = "Hello";
 
    printf("%d , %d \n", str1, str2); // 두 포인터의 주소 값 확인
}
 

 

위 코드와 같이 선언된 문자열 상수가 두 개이므로 두 개의 주소값이 다를 것이라고 생각 할 수 있지만 아닙니다.

 

결과를 보면 str1의 주소 값과 str2의 주소 값이 서로 동일한 것을 확인 할 수 있습니다.

좋은 컴파일러는 똑같은 코드라 할지라도 메모리를 효율적으로 사용하기 위해서 최적화라는 과정을 거칩니다.

 

위의 코드에서 str1과 str2가 가리키는 문자열은 상수이면서, 문자열의 내용은 같습니다. 즉 상수이기 때문에 문자열의 내용은 변하지 않을 것이며 굳이 같은 내용을 다른 공간에 할당 할 필요가 없게 되는 것입니다.

반응형