首页 > 编程笔记 > C语言笔记 阅读:142

C语言const的4种用法(附带实例)

通义灵码
我们编写过类似以下的 C 语言代码,用于修改字符数组中的值:
  1. char str[20] = "hello\n";
  2. printf("%s", str);
  3. str[0] = 'H';
  4. 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修饰指针所指向的数据

下面程序展示了一个错误示例,该示例尝试修改字符常量,导致程序运行出错:
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char *pStr = "hello\n";
  5. printf("%s", pStr);
  6. pStr[0] = 'H';
  7. printf("%s", pStr);
  8. return 0;
  9. }
上面的代码试图通过指针 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 关键字也可以修饰基本变量,例如:
  1. #include <stdio.h>
  2. int main()
  3. {
  4. const int n = 100;
  5. n = 101; // 这一行报错
  6. return 0;
  7. }
在这个例子中,const 关键字修饰了 int 类型的变量 n。变量 n 的值在初始化后只能读取,不能修改。尝试修改变量 n 的值将导致编译报错。

相关文章