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定义的局部变量。文章来源地址https://www.toymoban.com/news/detail-496841.html

到了这里,关于C语言进阶教程(const定义的变量真的不能被改变吗?)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(65)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(75)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(59)
  • Lua 进阶 · 教程笔记

    笔记的内容出自 Bilibili 上的视频:Lua教程-进阶部分 - 4K超清【不定期更新】 笔记主要用于供笔者个人或读者回顾知识点,如有纰漏,烦请指出 : ) 国内的大佬 云风 翻译了 Lua 的 Api 参考手册:传送门【】 以后读者在练习或者开发途中可以在参考手册里查看 Lua 提供的 Api。

    2024年01月24日
    浏览(51)
  • kotlin教程4:函数进阶

    kotlin教程:编程基础💎数据结构💎面向对象 kotlin 的函数定义非常灵活,既可以按照顺序传参,也可以通过参数名传参,而且可以设置参数默认值,这些在基础教程中已经讲过了。 此外, kotlin 中用 vararg 修饰的参数,为长度可变的参数列表 递归是一种常用的编程技巧,就像

    2024年02月05日
    浏览(45)
  • aardio教程二) 进阶语法

    aardio中除了基础数据类型外,其他的复合对象都是table(例如类和名字空间等)。table可以用来存放aardio的任何对象,包括另一个table。 在其他语言中的字典、列表、数组、集合映射等,在aardio中都使用table来实现。 创建字典 创建数组 数组和字典可以混用 使用class定义类

    2024年03月18日
    浏览(54)
  • SQL Server进阶教程读书笔记

    最近把SQL Server进阶教程重新读了一遍,顺便整理了一下书本中的知识点 CASE WHEN         ❑ 高手使用select做分支,新手用where和having做分支         ❑ 要写ELSE,要写END,避免未匹配上得到NULL         ❑ check到底怎么用?                  在SQL Server中,s

    2024年02月09日
    浏览(49)
  • SpringBoot进阶教程(七十七)WebSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 很多

    2024年02月08日
    浏览(74)
  • git 进阶系列教程--push

    功能介绍 将本地仓库中的内容同步到远程仓库 指令解析 这个命令就上将本地仓库中的文件同步到远程。是平时用到push最多的指令。它其实是一种简写方式。省略了远程仓库的地址,本地分支。 这个命令是比较全的一条指令。意思是推送本地master分支到远程(origin)的master分支

    2024年02月14日
    浏览(51)
  • git 进阶系列教程--add

    功能介绍 将工作区(working directory)中的内容放入暂存区(staging area) 追踪文件(解释:刚被添加到工作区的文件处于未跟踪状态(Untracked files),该命令会将新添加的文件放入暂存区,并且文件将处于已跟踪状态) 命令解析 添加工作区所有文件进入暂存区 最后的点可以理解为正则里的

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包