C语言深度剖析--不定期更新的第五弹

ops/2024/12/22 15:24:34/

在这里插入图片描述

const关键字

来看一段代码:

#include <stdio.h>
int main()
{int a = 10;a = 20;printf("%d\n", a);return 0;
}

运行结果如下:
在这里插入图片描述
接下来我们在上面的代码做小小的修改:

#include <stdio.h>
int main()
{const int a = 10;a = 20;printf("%d\n", a);return 0;
}

在这里插入图片描述
编译器报出来警告。这是因为const修饰的变量,不能直接被修改

const既可以放在类型名之前也可以放在类型名之后

来看以下的代码:

#include <stdio.h>
int main()
{int a = 10;int* p = &a;printf("before:%d\n", a);*p = 20;printf("after:%d\n", a);return 0;
}

运行结果如下:
在这里插入图片描述
这里我们需要知道一个点*p=a,用来修改a的值

在此基础上做一点点修改:

int main()
{const int a = 10;int* p = (int*) & a;//这里需要进行强制类型转换,因为编译器会报出警告,因为类型不一致printf("before:%d\n", a);*p = 20;printf("after:%d\n", a);return 0;
}

运行结果如下:
在这里插入图片描述
得出结论:const修饰的变量可以被指针间接修改

总的来说,const修饰的变量并非不可修改的常量

const修饰的变量意义何在?

1.让编译器直接修改式检查

2.告诉其他程序员这个变量不能修改

注意一个点:
在这里插入图片描述
字符串常量是真正意义上的不可被修改**,这不是C语言层面上的,而是操作系统层面上的保护

const的价值不在于运行的时候,而是在于编译的时候

const只能在定义的时候直接初始化,不能二次赋值。为什么?

const int a;
a=120;//这是不对的,因为不能被修改了

const修饰数组

一般只能是只读数组,就是不能被修改的

如下:

const int arr[100]={1,2,3,4,5};

就不能进行修改里面的数据,如:arr[0]=2;,这样编译器会报错的

什么是指针?

指针就是地址,它是一种具体的数据

在这里插入图片描述
指针变量是一种变量,里面保存的是指针

再来看个例子:

int x=100;//空间,变量的属性,左值
int y=x;//内容,数据的属性,右值

任何一个变量名,在不同的应用场景中,代表不同的含义==

对于指针变量来说呢?

int a=10;
int*p=&a;
q=p;

和上面同理,指针变量和普通变量差不多,不要过度神化或者畏惧

需要做个刻意地小练习:在看到指针和指针变量的时候,一定要问自己这里指的是指针,就是地址,还是指针变量是一个变量。里面存的是地址

const修饰指针

科普一个概念:
指针的解引用

int a=10;
int*p=&a;

这里面有几个变量?

答案是2个

在这里插入图片描述
内存选址的单位是以字节为单位

我们这里拿a举例子,a是int类型的,4个字节,也就意味着有4个地址,但是取地址的时候不是全部取出来,取的是地址最低的那个

我们可以得出来一个结论:在C语言中,任何变量取地址都是从最低地址开始取

解引用:

*p=20;
int b=*p;

修饰指针
在这里插入图片描述

int a = 10;
const int* p = &a;//p指向的变量不可以直接被修改
*p = 100;//这是不对的
p = 100;

这里可能会有疑惑,const不是离int最近吗,为什么要看*,因为const是关键字,int也是关键字,会引起关键字冲突

第二种写法和第一种写法效果是一致的,但是我们更推荐第一种写法

int a = 10;int* const p = &a;//p的内容不能直接被修改,p指向不能改*p = 100;//p = 100;//这个不对

同理,第四个,两个都不行

再来看一组代码的对比:

代码1:

const int *p=&a;
int*q=p;

代码2:

int *p=&a;
const int*q=p;

代码1,会存在警告是因为左右两边类型不一致,左边是int*类型,右边是被const修饰的常量,需要在p前面加上(int *) ,进行强制类型转换;

代码2不会存在警告,这里是因为我们把一个类型不严格的变量赋值给一个类型严格的变量编译器是不会报出警告的

来看示例:

void show(const int*_p)
{printf("%d\n",*_p);printf("show p:%p\n",&_p);
}
int main()
{int a=10;int*p=&a;show(p);printf("main p:%p\n",&p);}

这是一种预防性编程,预防未来可能会出现的问题

在C语言中,任何函数参数都一定要形成临时变量,包括指针变量
在这里插入图片描述
打印出来的地址是不同的

const修饰函数

例子如下:

const int*GetVal()
{static int a=10;return &a;
}
int main()
{const int*p=GetVal();
}

这里函数用const修饰,目的是不希望有人在返回值的时候进行修改

一般内置类型返回,加const没有意义


http://www.ppmy.cn/ops/107903.html

相关文章

教你制作一本加密的样本册

在这个信息的时代&#xff0c;保护自己的隐私和知识产权变得尤为重要。你有没有想过&#xff0c;如何将自己珍贵的样本资料变成一本只有自己才能查看的加密宝典&#xff1f;今天&#xff0c;我就来教你制作一本加密的样本册 第一步&#xff0c;打开浏览器&#xff0c;搜索FLBOO…

快速复制sql表结构 或者表结构加数据WHERE 1=1 和 WHERE 1=2

WHERE 11 和 WHERE 12 是 SQL 查询中的条件表达式&#xff0c;它们的作用不同&#xff1a; 创建数据库表 并且复制表结构加数据 create table cm_cust_info as select * from cm_cust where 11创建数据库表 并且复制表结构不加数据 create table cm_cust_info as select * f…

C++笔记20•数据结构:哈希(Hash)•

哈希 1.无序的关联式容器&#xff08;unordered_map&unordered_set&#xff09; unordered_map与unordered_set几乎与map与set是一样的&#xff0c;只是性能unordered_map与unordered_set比map与set更优一些。还有就是unordered_map与unordered_set是无序的&#xff0c;…

力扣 55题 跳跃游戏 记录

题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。示例 1&#xff…

sv标准研读第一章-综述

第1章 综述 1.1范围 本标准为IEEE 1800™SystemVerilog语言提供了语法和语义的定义&#xff0c;这是一种统一的硬件设计、规范和验证语言。该标准包括对行为级、寄存器传输级(RTL)和门级硬件描述、testbentch、coverage、assertion、面向对象和约束随机结构的支持&#xff0c…

免费无广告的音乐播放软件

酷狗音乐概念版可以免费听歌&#xff0c;但是新版本会有很多广告。 实测v2.4.2这个版本的最好用&#xff0c;没有广告和花里胡哨的功能&#xff0c;点播放后会自动签到领1日会员&#xff0c;音乐不会断播。 如果遇到暂时没有版权的歌&#xff0c;直接点击收藏&#xff0c;再到…

【大数据分析与挖掘算法】matlab实现——Apriori关联规则算法

实验一 &#xff1a;Apriori关联规则算法 一、实验目的 掌握有关Apriori关联规则算法的理论知识&#xff0c;从中了解关联规则的数学模型、基本思想、方法及应用。 二、实验任务 根据某超市的五条客户购物清单记录&#xff0c;使用Apriori关联规则算法进行计算&#xff0c;…

TCP远程命令执行

目录 一. 命令集 二. 命令执行模块实现 三. 服务端模块实现 四. 服务端调用模块实现 五. 客户端模块实现 六. 效果展示 此篇教大家如何利用TCP进行远程命令执行。 一. 命令集 将值得信任的命令放进一个txt文件中&#xff0c;执行命令时&#xff0c;就去这…