C语言const的4种用法(附带实例)
我们编写过类似以下的 C 语言代码,用于修改字符数组中的值:
因此,为了让数组不被修改,我们可以在原来的代码
需要注意的是,const 关键字可以放在 char 旁边,无论放在 char 的左边还是右边,都具有相同的效果。下面两种写法是等效的:
我们可以使用 const 关键字修饰指针所指向的 char。这样,如果尝试修改指针所指向的 char,编译器将报错。例如:

图 1 const关键字修饰char *pStr
第六行语句 pStr[0] = 'H' 尝试修改指针所指向的 char 内容。但在之前的声明中,char 已被关键字 const 修饰,因此该修改是被禁止的,并且编译时会报错。
当然,将 const 关键字放置在 char 右边也能起到同样的效果。
实际上,在这种情况下,const 关键字修饰了 *,也就是指针 pStr 本身的值。这意味着,在初始化后,指针 pStr 本身的值无法被修改。例如:
char str[20] = "hello\n"; printf("%s", str); str[0] = 'H'; printf("%s", str);那么,我们如果想禁止数组 str 的元素被修改,应该怎样做呢?
C语言const修饰数组元素
在 C语言中,const 是一个关键字,用于修饰一个变量,以表示该变量的值不可被修改。在程序中,const 可以用于修饰变量、指针、函数等不同的对象。因此,为了让数组不被修改,我们可以在原来的代码
char str[20] = "hello\n"
前面加上 const 关键字,例如:
const char str[20] = "hello\n";当使用 const 关键字修饰 char 时,char 将被禁止修改。数组 str 的元素 char 无法被修改,如果后续的语句尝试修改数组元素,编译器将报错。
需要注意的是,const 关键字可以放在 char 旁边,无论放在 char 的左边还是右边,都具有相同的效果。下面两种写法是等效的:
const char str[20] = "hello\n"; char const str[20] = "hello\n";这样,我们就成功地保护了数组 str 的元素不被修改。
C语言const修饰指针所指向的数据
下面程序展示了一个错误示例,该示例尝试修改字符常量,导致程序运行出错:#include <stdio.h> int main() { char *pStr = "hello\n"; printf("%s", pStr); pStr[0] = 'H'; printf("%s", pStr); return 0; }上面的代码试图通过指针 pStr 修改字符串常量 "hello\n"。然而,编译器在编译阶段并不会报错,错误只在运行时才会暴露。那么,如何在编译时就发现这个错误呢?
我们可以使用 const 关键字修饰指针所指向的 char。这样,如果尝试修改指针所指向的 char,编译器将报错。例如:
// 在char左边增加const关键字 const char *pStr = "hello\n";下图展示了在 Visual Studio 中编写使用 const 关键字修饰 char*pStr 的效果:

图 1 const关键字修饰char *pStr
第六行语句 pStr[0] = 'H' 尝试修改指针所指向的 char 内容。但在之前的声明中,char 已被关键字 const 修饰,因此该修改是被禁止的,并且编译时会报错。
当然,将 const 关键字放置在 char 右边也能起到同样的效果。
// char右边增加const关键字 char const *pStr = "hello\n";这样,我们可以在编译阶段发现错误,避免程序运行时出现问题。
C语言const修饰指针本身
那么,如果将 const 放到 * 的右边呢?例如:// 在星号*右边增加const关键字 char * const pStr = "hello\n";程序是可以成功编译的,说明 const 关键字并没有对 char 产生作用。既然程序编译通过了,那么 const 关键字的作用在哪里呢?
实际上,在这种情况下,const 关键字修饰了 *,也就是指针 pStr 本身的值。这意味着,在初始化后,指针 pStr 本身的值无法被修改。例如:
char * const pStr = "hello\n"; pStr = NULL;上述代码将编译报错,因为 const 关键字修饰了指针本身,这意味着指针无法被重新赋值或修改。
C语言const修饰基本变量
当然,const 关键字也可以修饰基本变量,例如:#include <stdio.h> int main() { const int n = 100; n = 101; // 这一行报错 return 0; }在这个例子中,const 关键字修饰了 int 类型的变量 n。变量 n 的值在初始化后只能读取,不能修改。尝试修改变量 n 的值将导致编译报错。