const和C指针
转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483733&idx=1&sn=9af9bc64a0ba45e4a782a53622ab4f51&chksm=c320ed42f4576454a5972d7bfa779468c370a4652d34f1087587f9e42a06db19d2e5d27df6b7#rd
const和C指针
众所周知,C中可以使用const来声明常量,即限定变量的值不可以修改。
当把const用在指针上面的时候,他有两个左右:
- 指针本身不能修改
- 指针指向的值不能被修改
修改指针和修改指针的值的区别
int main(){
int a = 10, c = 10, *b = &a;
b = &c; // 这一步叫做修改指针
*b = 20 // 这一步叫修改指针的值
}
const在指针的用法
如下,定义一个指针为:int * const a表示指针a本身不可以被修改,但指针a指向的值可以被修改:
int num = 10, num2 = 30;
int * const a = #
*a = 20; // 这一步操作是合法的
a = &num2; // 这一步操作是非法的
如下,定义一个指针为:int const * a表示指针a本身可以被修改,但指针a指向的值不可以被修改:
int num = 10, num2 = 30;
int const *a = #
a = &num2; // 这一步操作是合法的
*a = 20; // 这一步操作是非法的
若把以上两种形式合在一起,也就是定义一个指针为:int const * const a,则指针a本身和其指向的值都是不可以被修改的。
int num = 10, num2 = 30;
int const * const a = #
a = &num2; // 这一步操作是非法的
*a = 20; // 这一步操作是非法的
使用强制类型转换
当我们使用强制类型转换的时候,可以强制修改一些东西。
int num = 10, num2 = 30;
int const * a = #
a = &num2; // 这一步操作是非法的
*a = 20; // 这一步操作是非法的
int *b = (int *)a
*b = 20; // 这一步操作是合法的
通常这种操作没有意义。
const的位置
值得注意的是,const int *a和int const *a是完全一样的。
当的同一行定义多个变量的是后:
int const *a, *b, c;
是等价于
int const *a;
int const *b;
int const c;
即所有的部分都定义为了const,表示a和b指向的值不能改,c的值不能该。
同理,
const int *a, *b, c;
是等价于
const int *a;
const int *b;
const int c;
该定义效果是等价于int const *a, *b, c的。
若是如下形式:
int *const a, *b, c;
则是等价于
int *const a;
int *b;
int c;
const只对a生效,对b和c是不生效的。
总结
const在*前面表示该指针的值不能被修改,在*后面表示该指针本身不能被修改。
const和C指针的更多相关文章
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- const typedef 和指针的问题(这里必须初始化的才初始化了,不必须的则没有初始化)
这里很容易搞混: tyepdef double dou;//这里是dou是double的别名 #include<iostream> using namespace std; int mai ...
- const对象,指向const对象的指针 和 const 指针
const对象: const对象声明时必须赋初值,该值在编译阶段确定,不可在程序中修改. const修饰符既可放在类型名前也可放在类型名后,通常放在类型名前.不过放在类型名后易于理解. const i ...
- C++中的error C2662,const的this指针问题
今天在写C++代码的时候遇到一个错误,涉及到了常量的this指针的问题. 简化后的代码如下: #include <iostream> #include <string> usi ...
- oc const 关键字 对指针的理解
/* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...
- const引用和指针
1.可以为const引用初始化一个非const的对象.字面值,甚至是一般表达式. 2.对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const所定义的类型 ...
- const关键字与指针
const与指针在一起的几种情况. const int *p1; //表示p1本身不是const,指向的变量是const. const *int p2; //语法错误 int const *p3; / ...
- const变量指针赋值给非const类型的指针运行结果
在c++可以定义一个const变量,然后把变量的值赋给一个非const指针,可以通过指针来改变const变量的值吗?下面的截图给出了答案
- c++引用和const 用法 数组 指针
非const引用,只能用object为其赋值: <c++primer>P52 而const引用则可以用临时变量为其赋值: 如: const int &r = 32://可以 int ...
- const变量通过指针修改问题
const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...
随机推荐
- mpi转以太网连接200PLC转以太网modbusTCP服务器通信配置方法
兴达易控200PLC转以太网modbusTCP服务器通信配置方法 产品简介 兴达易控PPI-ETH-XD1.0用于西门子S7-200/SMART S7-200PLC的以太网数据采集,非常方便构建生产管 ...
- 分布式事务 —— SpringCloud Alibaba Seata
Seata 简介 传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚.随着公司的快速发展.业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的 ...
- MySQL系列之MHA高可用——主从复制架构演变介绍、高可用MHA、管理员在高可用架构维护的职责
文章目录 1. 主从复制架构演变介绍 1.1 基本结构 1.2 高级应用架构演变 1.2.1 高性能架构 1.2.2 高可用架构 2. 高可用MHA ***** 2.1 架构工作原理 2.2 架构介绍 ...
- Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用
Dubbo3注册中心的使用 zookeeper注册中心的使用 依赖引入 <dependency> <groupId>org.apache.dubbo</groupId&g ...
- vscode没有完全汉化怎么办? vs code部分内容没汉化的解决办法
- SP3377
题目简化和分析: 前言:这题目背景真奇怪. 我们可以将每种关系,看成一条边,如果出现奇数边环就不满足. 例如:\(a,b\) 异性 \(a,c\) 异性 \(b,c\)异性 这种情况是不满足的. 相当 ...
- CF339D
题目简化与分析: 题目翻译说的还是太复杂了,其实只是给你 $ n $ 个数,奇数位 \(\operatorname{or}\),偶数位 \(\operatorname{xor}\). 会修改某个元素 ...
- 这一大波Offer来的太突然了
今年 10 月份之前,作为双非院校的本科生来说是非常煎熬的,十几年的求学之路,加上猛学编程和猛肝算法,到头来却是"无一次面试机会",背后的辛酸不言而喻. 然而,国庆之后," ...
- 掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具
Kubernetes 是一款管理容器化应用程序的强大工具.然而,与任何复杂的系统一样,使用它时也可能出错.当问题出现时, 掌握有效的故障排除技术和工具非常重要. 本文将介绍以下步骤,助您了解事件收集的 ...
- ES6入门(一)
1.let声明的变量只在let命令所在的代码块内有效 2.不存在变量提升,先使用变量,后定义变量,就会报错. 3.let不允许在相同作用域内,重复声明同一个变量.