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

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

我们编写过类似以下的 C 语言代码,用于修改字符数组中的值:
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 的值将导致编译报错。

相关文章