int main(){
const char* test1 = "Hello World!"; // 컴파일 ok
// 포인터는 주소를 담는 바구니
// const char[13] 형의 문자 배열을 가리키는 포인터이다.
// 따라서 const char* 형 포인터 변수로만 가리킬 수 있다.
// test1은 문자열(문자 배열)의 첫번째 문자 주소를 가리키는 바구니
// sizeof(test1) == 8 (cf, 솔루션 플랫폼: x64)
char test2[] = "Hello World!"; // 컴파일 ok
// 배열은 그 자체로 같은 데이터까리 붙어있는 바구니 모음
// main의 스택 프레임에 데이터 공간이 존재하는 것이고,
// 특정 요소의 문자를 변경할 수 있다. (const char*로 가리키는 것과의 차이점)
// test2는 문자 배열의 이름이자, 문자 배열의 첫번째 문자 주소를 가리키는 바구니
// sizeof(test2) == 13 (배열이란 의미를 담고 있다.)
}
아래와 같은 함수를 추가해본다.
void Test(char a[]) {
a[0] = 'X';
}
컴파일러는 char a[]
매개변수를 char *a
로 바꿔준다.
char[]
-> char*
따라서 Test(test1)
은 컴파일 에러가 난다. test1은 const 포인터형이기 때문이다. 반면 Test(test2)
는 정상적으로 컴파일 완료되고, 배열의 첫번째 요소(문자)를 변경한다.