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

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

前言

本篇文章将为大家讲解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定义的局部变量。


相关文章
|
2天前
|
存储 编译器 数据库
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
|
7天前
|
存储 编译器 C语言
C语言中的变量与常量
C语言中的变量与常量
16 0
|
7天前
|
存储 程序员 C语言
C语言指针变量的深入解析与应用
C语言指针变量的深入解析与应用
14 0
|
7天前
|
存储 算法 编译器
C语言中的二维数组:定义与初始化技术详解
C语言中的二维数组:定义与初始化技术详解
21 0
|
7天前
|
存储 编译器 C语言
C语言指针变量的定义与初始化技术详解
C语言指针变量的定义与初始化技术详解
18 0
|
7天前
|
存储 C语言 索引
C语言一维数组的定义与初始化技术详解
C语言一维数组的定义与初始化技术详解
16 0
|
8天前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
18 1
|
8天前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
19 1
|
8天前
|
编译器 C语言 C++
从C语言到C++_21(模板进阶+array)+相关笔试题(下)
从C语言到C++_21(模板进阶+array)+相关笔试题
22 2
|
8天前
|
编译器 C语言 C++
从C语言到C++_21(模板进阶+array)+相关笔试题(上)
从C语言到C++_21(模板进阶+array)+相关笔试题
20 0