返回介绍

6.3.4 再谈只读变量

发布于 2025-04-11 22:32:59 字数 1310 浏览 0 评论 0 收藏 0

在第 2 章只读变量一节介绍过,可以通过 const 修饰符将一个变量修饰为只读变量。只读变量只可访问而不可被修改,这和常量的访问权限非常类似,但只读变量并不是常量,因此,它不能作为数组定义时的长度,即不能把只读变量放在数组定义时的中括号内。这是为什么呢?因为 const 修饰的是变量名,而不是变量中的数据,下面举例说明:

const int a = 10;
a = 20;           //错误,只读变量不可被修改

上面定义了一个只读变量 a,然后通过变量名 a 来修改变量的值为 20,这会导致编译错误。那么 a 的数据真的不能被修改吗?

int *pi = (int *)&a;
*pi = 20;
printf("a = %d\n", a);

上面首先定义了一个 int 类型的指针变量 pi,并将其值初始化为变量 a 的地址。由于 a 是一个只读变量,因此获取的地址类型为 const int*,即是一个常量指针。因此,我们在前面通过“( )”将其进行强制类型转换,将 int*的值初始化给指针变量 pi。第二条语句中,通过解引用将 20 赋值给指针所指向的对象,即变量 a。第三条语句中,通过 printf 打印变量 a 的值。

编译运行程序,结果如下:

a = 20

可见,变量 a 的值被修改为 20 了。从这里可以得出结论:在只读变量 a 的定义语句中,const 只是限制了变量名 a 的修改权限,即不能通过变量名 a 来修改值,但还是可以通过指针来间接地修改变量 a 的值。也就是说,变量 a 的值并非是常量,是可以被修改的,只不过不能通过变量名 a 来修改,需要通过指针来间接地修改。

同样地,再来看常量指针。例如:

int b = 10;
const *int pi = &b;
*pi = 20;            //错误,不能修改 pi 所指向的对象,即变量 b

以上语句首先定义了 int 类型变量 b,并初始化为 10;接着,定义了常量指针 pi,并将变量 b 的地址作为其初始值;第三条语句中,通过解引用,把 20 赋值给 pi 所指向的对象,即变量 b,这时会造成编译错误,提示 pi 所指向的是只读变量,不可被修改,但 pi 所指向的变量 b 并不是只读变量。因此,在常量指针的定义语句中,const 仅修饰了指针变量名 pi,即用户不能通过 pi 来访问它所指向的对象,即变量 b,但是可以通过变量名 b 来直接修改它的值,例如:

b = 20;

将 20 赋值给变量 b,这是没问题的。

最后总结一下,通过 const 来修饰变量时,仅仅是修饰变量名,即只限制了变量名的修改权限,而并非将变量的值修饰为只读。C 语言中,只有常量才是值具有只读权限,所以只读变量并非常量。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。