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

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

@TOC

前言

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

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

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

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

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

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

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

#include

int main()

{

const int num = 0;

int* p = #

*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定义的局部变量。

相关推荐

为什么早上起床总是头晕?不一定是没睡好,多与4种疾病有关
超91%的消化率!这款猫粮配方新奇在哪里?
365bet新手开户指南

超91%的消化率!这款猫粮配方新奇在哪里?

📅 01-23 👁️ 4571
qq如何取消自动续费
365bet在线体育

qq如何取消自动续费

📅 09-02 👁️ 2878
小米手机定位服务设置详解:提升应用体验的关键步骤
365被限制了让提款

小米手机定位服务设置详解:提升应用体验的关键步骤

📅 09-30 👁️ 2539
苍蝇幼虫叫什么 苍蝇幼虫是蛆吗
365bet新手开户指南

苍蝇幼虫叫什么 苍蝇幼虫是蛆吗

📅 06-29 👁️ 5990
突发:日本核电站放射性气体泄漏
365被限制了让提款

突发:日本核电站放射性气体泄漏

📅 09-30 👁️ 3451