const 위치에 따른 해석 (Feat. Vulkan API의 복잡한 type!)
변수와 상수의 구분
변수 : 선언 이후 값을 계속 바꿀 수 있는 저장 공간
상수 : 선언할 때 값을 할당 후, 값을 바꿀 수 없는 저장 공간 (const keyword로 표현)
리터럴 : 값 자체
const 위치에 따른 해석
const char* : 상수형 char에 대한 ptr. ptr이 가리키는 변수의 값을 바꿀 수 없다.
char const * : char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없다.
const char const * : 상수형 char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없고, 변수의 값도 바꿀 수 없다.
응용
다음 코드는 vulkan api의 VkInstanceCreateInfo 구조체와 구조체 초기화의 일부이다.
ppEnabledExtensionNames는 const char* const* 형 변수이다. (line 10)
glfwExtensions는 const char **형 변수이다.
glfwExtensions는 char에 대한 이중 포인터인데 이걸 상수화하였으므로
char value가 상수화된다.
ppEnabledExtensionNames에는 glfwExtensions의 값이 대입되기 때문에
char에 대한 이중 포인터가 된다.
이 이중 포인터가 가리키는 char value가 상수화되어 있으므로 const char,
이 이중 포인터를 상수화하기 위해 const*가 붙었다.
glfwExtensions와 ppEnabledExtensionNames 둘다 char** 인 상황에서,
glfwExtensions는 가장 하단의 char value가 상수라고 표현하는 것이고,
ppEnabledExtensionsNames는 char value가 상수는 동의하는데
자신이 가리키는(이중 포인터) 것도 바꾸지 않겠다는 것이다.