C语言进阶教程(const定义的变量真的不能被改变吗?)

举报
yd_274589494 发表于 2023/10/30 10:16:20 2023/10/30
【摘要】 @TOC 前言本篇文章将为大家讲解const定义的变量到底能不能被改变。 一、const定义的变量属性是常量吗很多同学会误认为const定义的变量就是常量,那么常量是不可被修改的,所以说const定义的变量也是不可被修改的,这是一个错误的观点,其实const定义的变量属性是一个只读的变量属性,而不是常量。const定义的变量本质还是变量是可变的,不是常量。const修饰的变量只是告诉编译器改...

@TOC


前言

本篇文章将为大家讲解const定义的变量到底能不能被改变。

一、const定义的变量属性是常量吗

很多同学会误认为const定义的变量就是常量,那么常量是不可被修改的,所以说const定义的变量也是不可被修改的,这是一个错误的观点,其实const定义的变量属性是一个只读的变量属性,而不是常量。

const定义的变量本质还是变量是可变的,不是常量。

const修饰的变量只是告诉编译器改变量不能出现在赋值符号的左边。

二、如何改变const定义变量的值

既然const定义的变量不能出现在赋值符号左边,那么这里我们使用指针来修改const定义的变量值,这样就能够成功将const定义的变量值进行修改了。

#include <stdio.h>

int main()
{
    const int num = 0;

    int* p = &num;

    *p = 2;

    printf("num = %d\n", num);

    return 0;
}

注意点:
对于const定义的全局变量和使用static修饰的局部const变量,它们都具有不可修改的属性。这意味着它们的值在初始化后不能再进行修改。

在全局作用域下,使用const定义的变量被视为全局常量。这些变量在程序执行期间保持不变,无法通过任何方式修改它们的值。

使用static修饰的局部const变量也具有类似的特性。这些变量在第一次声明和初始化后,其值会在其所在作用域内保持不变,无法在后续的代码中修改。

然而,对于使用const定义的局部变量,它们并不具有不可修改的属性。const关键字仅指示编译器在声明时要求变量为只读,但这并不意味着它们的值不可变。在执行过程中,const局部变量的值仍然可以被修改,只是编译器不会提供安全性检查。

存储区域:

对于全局const变量和使用static修饰的局部const变量,它们的存储位置通常是在静态数据区(static data segment)。

局部const变量通常被存储在栈(stack)中。栈是一种用于存储局部变量、函数参数和其他临时数据的内存区域。局部const变量的生命周期与其所在的作用域相对应,在其作用域结束时会自动释放。

三、const和指针相遇

让我们逐个解释这些声明中指针的类型和指针指向的内容是否为常量(const):

const int* p;: 这里声明的是一个指向 int 类型的指针 p,并且指针所指向的内容是不可修改的(常量)。也就是说,你可以修改指针 p 指向其他 int 变量,但不能通过指针 p 来修改所指向的 int 变量的值。

int const *p;: 这里也声明了一个指向 int 类型的指针 p,并且指针所指向的内容是不可修改的(常量)。与第一个声明相同,你可以修改指针 p 指向其他 int 变量,但不能通过指针 p 来修改所指向的 int 变量的值。

int* const p;: 这里声明的是一个常量指针 p,指针本身是不可修改的。也就是说,你不能修改指针 p 指向的地址,但是可以通过指针 p 来修改所指向的 int 变量的值。

const int* const p;: 这里既声明了一个常量指针 p,又声明了指针所指向的内容是不可修改的(常量)。这意味着你不能修改指针 p 指向的地址,也不能通过指针 p 来修改所指向的 int 变量的值。

总结起来,const int* p; 和 int const p; 是等价的,表示指向常量的指针;int const p; 表示常量指针;const int* const p; 表示指向常量的常量指针。

总结

本篇文章解决了大家一直以来对const产生的误解,const定义的变量并不是无法被修改的,使用指针可以修改const定义的局部变量。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。