转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483733&idx=1&sn=9af9bc64a0ba45e4a782a53622ab4f51&chksm=c320ed42f4576454a5972d7bfa779468c370a4652d34f1087587f9e42a06db19d2e5d27df6b7#rd

const和C指针

众所周知,C中可以使用const来声明常量,即限定变量的值不可以修改。

当把const用在指针上面的时候,他有两个左右:

  1. 指针本身不能修改
  2. 指针指向的值不能被修改

修改指针和修改指针的值的区别

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 *aint const *a是完全一样的。

当的同一行定义多个变量的是后:

int const *a, *b, c;

是等价于

int const *a;
int const *b;
int const c;

即所有的部分都定义为了const,表示ab指向的值不能改,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生效,对bc是不生效的。

总结

const*前面表示该指针的值不能被修改,在*后面表示该指针本身不能被修改。

const和C指针的更多相关文章

  1. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  2. const typedef 和指针的问题(这里必须初始化的才初始化了,不必须的则没有初始化)

    这里很容易搞混: tyepdef double dou;//这里是dou是double的别名 #include<iostream> using namespace std; int mai ...

  3. const对象,指向const对象的指针 和 const 指针

    const对象: const对象声明时必须赋初值,该值在编译阶段确定,不可在程序中修改. const修饰符既可放在类型名前也可放在类型名后,通常放在类型名前.不过放在类型名后易于理解. const i ...

  4. C++中的error C2662,const的this指针问题

    今天在写C++代码的时候遇到一个错误,涉及到了常量的this指针的问题. 简化后的代码如下: #include <iostream> #include <string> usi ...

  5. oc const 关键字 对指针的理解

    /* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...

  6. const引用和指针

    1.可以为const引用初始化一个非const的对象.字面值,甚至是一般表达式. 2.对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const所定义的类型 ...

  7. const关键字与指针

    const与指针在一起的几种情况. const int *p1; //表示p1本身不是const,指向的变量是const. const *int p2; //语法错误 int const *p3; / ...

  8. const变量指针赋值给非const类型的指针运行结果

    在c++可以定义一个const变量,然后把变量的值赋给一个非const指针,可以通过指针来改变const变量的值吗?下面的截图给出了答案

  9. c++引用和const 用法 数组 指针

    非const引用,只能用object为其赋值: <c++primer>P52 而const引用则可以用临时变量为其赋值: 如: const int &r = 32://可以 int ...

  10. const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...

随机推荐

  1. mpi转以太网连接200PLC转以太网modbusTCP服务器通信配置方法

    兴达易控200PLC转以太网modbusTCP服务器通信配置方法 产品简介 兴达易控PPI-ETH-XD1.0用于西门子S7-200/SMART S7-200PLC的以太网数据采集,非常方便构建生产管 ...

  2. 分布式事务 —— SpringCloud Alibaba Seata

    Seata 简介 传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚.随着公司的快速发展.业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的 ...

  3. MySQL系列之MHA高可用——主从复制架构演变介绍、高可用MHA、管理员在高可用架构维护的职责

    文章目录 1. 主从复制架构演变介绍 1.1 基本结构 1.2 高级应用架构演变 1.2.1 高性能架构 1.2.2 高可用架构 2. 高可用MHA ***** 2.1 架构工作原理 2.2 架构介绍 ...

  4. Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用

    Dubbo3注册中心的使用 zookeeper注册中心的使用 依赖引入 <dependency> <groupId>org.apache.dubbo</groupId&g ...

  5. vscode没有完全汉化怎么办? vs code部分内容没汉化的解决办法

  6. SP3377

    题目简化和分析: 前言:这题目背景真奇怪. 我们可以将每种关系,看成一条边,如果出现奇数边环就不满足. 例如:\(a,b\) 异性 \(a,c\) 异性 \(b,c\)异性 这种情况是不满足的. 相当 ...

  7. CF339D

    题目简化与分析: 题目翻译说的还是太复杂了,其实只是给你 $ n $ 个数,奇数位 \(\operatorname{or}\),偶数位 \(\operatorname{xor}\). 会修改某个元素 ...

  8. 这一大波Offer来的太突然了

    今年 10 月份之前,作为双非院校的本科生来说是非常煎熬的,十几年的求学之路,加上猛学编程和猛肝算法,到头来却是"无一次面试机会",背后的辛酸不言而喻. 然而,国庆之后," ...

  9. 掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具

    Kubernetes 是一款管理容器化应用程序的强大工具.然而,与任何复杂的系统一样,使用它时也可能出错.当问题出现时, 掌握有效的故障排除技术和工具非常重要. 本文将介绍以下步骤,助您了解事件收集的 ...

  10. ES6入门(一)

    1.let声明的变量只在let命令所在的代码块内有效 2.不存在变量提升,先使用变量,后定义变量,就会报错. 3.let不允许在相同作用域内,重复声明同一个变量.