转载: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. 西门子Teamcenter 许可分析

    西门子Teamcenter 许可 绑定了主机名称,mac地址 另外,Teamcenter可以支持多个许可服务 所以.......................找个正式许可复制就可以 end succ ...

  2. 前端三件套系例之BootStrap—— BootStrap组件、BootStrap插件

    文章目录 1 BootStrap组件 1 Glyphicons 字体图标 2 下拉菜单 2.1 基本使用 2.2 对齐 2.3 标题 2.4 分割线 2.5 禁用的菜单项 3 按钮组 3.1 基本使用 ...

  3. 报错Intel MKL FATAL ERROR: Cannot load libmkl_core.so.的一种解决方法

    问题 今天上80服务器跑mdistiller的代码时,意外发现torch.numpy都不能用了T_T 以torch为例,出现如下报错情况 以numpy为例,出现如下报错情况 我们先看看报错信息,这个报 ...

  4. Python 数学函数和 math 模块指南

    Python 提供了一组内置的数学函数,包括一个广泛的数学模块,可以让您对数字执行数学任务. 内置数学函数.min() 和 max() 函数可用于在可迭代对象中查找最低或最高值: 示例:查找可迭代对象 ...

  5. (int argc, char *argv[])在MCU中的调试使用

    这里主要讲了基于RTT的 finsh->MSH_CMD_EXPORT 方法,在串口终端中调用自定义函数,并传入参数的方法. 在传统的MCU开发中 当我们需要测试一个函数在传入不同参数时的运算结果 ...

  6. Android RTL 语言适配

    RTL 语言,即 right to left language,也就是右对齐的语言,与一般语言按照左对齐的方式不同,需要进行特别适配. AndroidManifest.xml 文件中,增加 andro ...

  7. .NET领域性能最好的对象映射框架Mapster使用方法

    Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射.在本文中,我将详细介绍如何在.NET中使用Mapster,并提供一些实例和源代码. 和其它框架性能对比: ...

  8. Vite4+Typescript+Vue3+Pinia 从零搭建(4) - 代码规范

    项目代码同步至码云 weiz-vue3-template 要求代码规范,主要是为了提高多人协同和代码维护效率,结合到此项目,具体工作就是为项目配置 eslint 和 prettier. editorc ...

  9. 聊聊卷积神经网络CNN

    卷积神经网络(Convolutional Neural Network,CNN)是一种被广泛应用于图像识别.语音识别和自然语言处理等领域的深度学习模型.与RNN.Transformer模型组成AI的三 ...

  10. 解决JPA对查询对象set属性值导致数据更新的问题

    问题描述 1.开启了数据库事务 2.通过EntityManager执行查询,获得返回对象 3.代码业务逻辑处理,其中有对象set属性值的操作 4.没有执行过JPA的save方法或者update语句 5 ...