C语言中双重const关键字的语法含义与正确使用方法咨询
C语言const修饰指针的核心规则
C语言中const和指针结合时的含义可以通过***的相对位置**快速判断:
- 出现在
*左侧的const:限定指针指向的内容不可修改,无法通过该指针修改目标变量的值 - 出现在
*右侧的const:限定**指针本身的值(存储的内存地址)**不可修改,无法让该指针指向其他内存地址 - 同一侧重复书写的
const属于冗余语法,编译器会自动忽略重复的const修饰
测试代码说明
第一个测试用例
char const * const ptr = &a;
这里const同时出现在*的左右两侧,因此指向的内容和指针本身都不可修改,尝试写ptr = &b修改指针指向,自然会触发编译报错,和你观察到的现象一致。
第二个测试用例
char const const *ptr = &a;
两个const都出现在*的左侧,重复的const会被编译器忽略,等价于char const *ptr = &a,只有指向的内容不可修改,指针本身的指向可以改动。因此ptr = &b是合法操作,修改后ptr指向变量b,输出*ptr得到B,而原变量a没有被改动,输出还是A,完全符合语法规则。
原代码片段的含义
你看到的定义:
static char const *const delimit_method_string[] = { "none", "prepend", "separate", NULL };
是一个静态只读字符串数组,拆解含义如下:
static:限定该数组的作用域仅在当前源文件内,其他源文件无法直接引用*左侧的const:数组的每个元素是指向const char类型的指针,即指向的字符串字面量内容不可修改,不能通过delimit_method_string[1][0] = 'P'这类语句修改字符串内容*右侧的const:数组里存储的每个指针本身的值不可修改,不能通过delimit_method_string[0] = "other"这类语句修改数组元素的指向- 整体就是一个不可修改元素指向、也不可修改内容的静态字符串表,通常用来存储固定的枚举值对应的字符串映射,是C语言中非常常见的常量字符串表写法。
内容的提问来源于stack exchange,提问作者ABHIJITH EA
相关产品推荐
相关产品推荐

