学习笔记:const int *pi 与 int *const pi 区别

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整 阅读详情
const int *pi的语义
我先来说说const int *pi是什么作用 (当然int const *pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:
/* 代码开始 */
int i1 = 30;
int i2 = 40;
const int *pi = &i1;
pi = &i2; /* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/
i2 = 80; /* 想想看:这里能用*pi = 80来代替吗?当然不能!*/
printf("%d\n", *pi); /* 输出是80 */
/* 代码结束 */


语义分析:
看出来了没有啊,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了!
首先const 修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的i2是变量,不是常量)。
其次,pi前并没有用const 修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。你可能会疑问:那我又如何用const 来修饰pi呢?其实,你注意到int *const pi中const 的位置就大概可以明白了。请记住,通过格式看语义。哈哈,你可能已经看出了规律吧?那下面的一节也就没必要看下去了。不过我还得继续我的战斗!
3. 再看int *const pi
确实,int *const pi与前面的int const *pi会很容易给混淆的。注意:前面一句的const 是写在pi前和*号后的,而不是写在*pi前的。很显然,它是修饰限定pi的。我先让你看例子:
/* 代码开始 */
int i1 = 30;
int i2 = 40;
int *const pi = &i1;
/* pi = &i2; 注意这里,pi不能再这样重新赋值了,即不能再指向*/
另一个新地址。(第4行的注释)*/
/* 所以我已经注释了它。*/
i1 = 80; /* 想想看:这里能用 *pi = 80; 来代替吗?可以,这里可以通过*pi修改i1的值。(第5行的注释)*/
/* 请自行与前面一个例子比较。 */
printf("%d", *pi); /* 输出是80 */
/* 代码结束 */

语义分析:
看了这段代码,你明白了什么?有没有发现pi值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi来修改i1的值了。与前一个例子对照一下吧!看以下的两点分析:
1)pi因为有了const 的修饰,所以只是一个指针常量:也就是说pi值是不可修改的(即pi不可以重新指向i2这个变量了)(请看第4行的注释)。
2)整个*pi的前面没有const 的修饰。也就是说,*pi是变量而不是常量,所以我们可以通过*pi来修改它所指内存i1的值(请看第5行的注释)。
总之一句话,这次的pi是一个指向int变量类型数据的指针常量。
我最后总结两句:
1) 如果const 修饰在*pi前,则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi。
2) 如果const 是直接写在pi前,则pi不能改(即不能类似这样:pi=&i;赋值)。
请你务必先记住这两点,相信你一定不会再被它们给搞糊了。现在再看这两个声明语句int const *pi和int *const pi时,呵呵,你会头昏脑胀还是很轻松惬意?它们各自声明的pi分别能修改什么,不能修改什么?再问问自己
4.补充三种情况
这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!
情况一:int *pi指针指向const int i常量的情况
/* begin */
const int i1 = 40;
int *pi;
pi = &i1; /* 这样可以吗?不行,VC下是编译错。*/
/* const int 类型的i1的地址是不能赋值给指向int 类型地址的指针pi的。否则pi岂不是能修改i1的值了吗!*/
pi = (int *) &i1; /* 这样可以吗?强制类型转换可是C所支持的。*/
/* VC下编译通过,但是仍不能通过 *pi = 80来修改i1的值。去试试吧!看看具体的怎样。*/
/* end */


情况二:const int *pi指针指向const int i1的情况
/* begin */
const int i1=40;
const int * pi;
18
pi=&i1;/* 两个类型相同,可以这样赋值。很显然,i1的值无论是通过pi还是i1都不能修改的。 */
/* end */


情况三:用const int *const pi声明的指针
/* begin */
int i;
const int * const pi=&i; /*你能想象pi能够作什么操作吗?pi值不能改,也不能通过pi修改i的值。因为不管是*pi还是pi都是const的。 */
/* end */


Fortran基础编程(3)——格式化输出 本篇推文将进一步讲解Fortran基础语法中格式化输出与声明部分,让我们的代码更加美观起来吧~ 阅读详情

相关推荐

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

详解const int* 与 int const*的区别

wehttps://www.zhihu.com/question/443195492

weiyuanzhang123的博客 6773

莫比乌斯反演

本文从算法竞赛和数论角度出发,系统介绍了狄利克雷卷积与莫比乌斯反演的核心概念。首先定义了数论函数及其基本性质,重点阐述了狄利克雷卷积的代数结构(交换环)和关键恒等式(如μ*1=ε)。随后通过卷积视角简化了莫比乌斯反演的证明过程。最后将理论提升至抽象代数层面,揭示这些数论工具本质上是偏序集关联代数在整除关系下的特例,其中莫比乌斯函数对应Zeta函数的逆元。全文展现了数学概念从具体到抽象的升华过程,为理解这些工具提供了更深刻的代数视角。

aichitang2024的博客 391

const int *,const int * const和int const *有什么区别?

我总是搞砸了如何正确使用const int* , const int * const和int const * 。 是否有一组规则定义您可以做什么和不能做什么? 我想知道在分配,传递给函数等

asdfgh0077的博客 1484

如何解决ipa包上传App Store Connect时出现的无效二进制文件问题

本文详细解析了ipa包上传App Store Connect时出现无效二进制文件问题的常见原因及解决方案。从Scheme配置、架构支持到权限声明,提供了全面的检查步骤和实用技巧,帮助开发者快速定位并解决上传问题,确保应用顺利通过审核。

weixin_28833069的博客 315

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法。

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法

weixin_42960380的博客 2500

const int *a与int *const a,const int *const a的区别

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里 1、const int *a 这里const 修饰的是int,而int定义的是一个整值 因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象 eg:        const int *a = 0;        const int b = 1;     

ZH837964767的专栏 2万+

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

浅谈const int *,int const *与int *const

最近恰好在学习浙江大学翁恺老师的《C语言程序设计》,老师对指针与const的见解颇深,感兴趣可在mooc搜索视频观看9.1-5节 先上总结: 在开始之前,先介绍一条const的规则:const默认与其左边结合,当左边没有任何东西则与右边结合。(来自知乎:C++里 const int* 与 int const* 有什么区别?) 那么首先先来谈谈const int *与int const *的区别与联系,由上面的规则其实很容易知道:const int *与int co...

YMGogre的博客 4244

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。

4231

【AI产品与商业航图】Flux.1 完全开源 AI 绘图模型:本地部署与 ComfyUI 实战指南

Flux.1是一个开源项目,用户可以自由使用和修改,完全免除使用费用。🖥️本地部署支持:与一些依赖云端计算的工具不同,Flux.1支持本地部署,确保用户可以离线使用并自主控制数据隐私。🔄兼容ComfyUI框架:Flux.1可以无缝集成到ComfyUI中,用户可以享受更加简便和直观的操作界面。🎨卓越的图像生成能力:Flux.1能够生成高质量、细腻的图像,支持多种风格与创作主题的切换。💾低硬件要求。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1736

const int * 、int * const、int const* 等的区别和联系

前言:很多人都把const int * 、int * const、int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习笔记记录下来。 一,const修饰符用于指针         将const用于指针有些很微妙的地方,有两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止使用

阿黄啦啦 7614

【从零到一】Jetson Nano上YOLOv5部署完全攻略:零基础小白也能玩转边缘AI推理

文章摘要: 本文详细介绍了在Jetson Nano边缘设备上部署YOLOv5目标检测模型的完整流程。从硬件准备、系统镜像烧录、基础环境配置,到CUDA/cuDNN验证、Python虚拟环境搭建及PyTorch安装,逐步指导开发者完成部署准备。教程兼顾理论原理与实践操作,提供Python和C++两种实现方案,并涵盖TensorRT优化、实时检测等生产级应用场景,帮助零基础开发者快速掌握边缘AI推理技术,实现高性能目标检测应用。

LXY_LOVE36的博客 367

const int *p 与 int *const p的区别 最方便理解的记忆方法

文章目录 const int *p int const *p int *const p const int * const p 总结 如果您对这几个有一定的了解,或者只是记忆模糊不清建议您直接看本文最后总结部分,相信对您有一个更好的理解记忆方式,如果您对此比较陌生,建议您从头观看,直观感受。 强调:总结是精华本分。 一、const int *p 直接上代码 这段代码会报错,那么为什么会报错,原因就是const封锁了*p *p是一个常量,所以他是不可以更改的。...

qq_45615577的博客 5669

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

const int *pi与int *const pi的区别

<br />/* const int *pi */ #include <stdio.h> int main(void) { int i1 = 30; int i2 = 40; const int *pi = &i1;/*如果const 修饰在*pi前,则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi*/ pi = &i2;/* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/ i2 = 80;/* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/

GhostTigerMan 759

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

详解const int *p,int*const p,int const *p

<br />详解const int *p,int*const p,int const *p<br />1 从const int n 说起 <br />    const int n=20,有了const修饰的n 我们不称它为变量,而称符号常量,代表着20这个数。这就是const 的作用。n是不能在它处重新赋新值了。 <br />     认识了const 作用之后,另外,我们还要知道格式的写法。有两种:const int n=20;与int const n=20;。它们是完全相同的。这一点我们是要清楚。总之

yjh0628的专栏 6693

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

const int *x 和 int * const x, const int& x和 int const &x的区别

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里 1、const int *a 这里const 修饰的是int,而int定义的是一个整值 因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象 eg:   const int *a = 0;   const int b = 1;   int c = 1;   a

chenwk891的专栏 4066

const int * pi 、int const * pi与int * const pi及其操作

const int * pi 、int const * pi与int *  const  pi及其操作 1 从const int i 说起     你知道我们申明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下: int i=0; //… i=20;//这里重新赋值了     不过有一天我的程序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值。之后我的

zhang2050jian的专栏 871

关于int *const p,const int *p和int const *p的区别

在学习c语言的过程中,可能我们很少见到int int *const p,const int *p和int const *p,但当我们在学习c++的过程中,就会遇到这些模糊不清的概概念,如果没搞清楚它们的区别,我们在使用过重中会很痛苦,但如果我们搞懂了它们之间的区别之后,用起来非常方便。 首先int const * p=const int * p;都表示*p的值不能改变,而p(即地址)是可以改变的; #include using namespace std; int main() { int a=100; i

weixin_45905650的博客 1937

const int * ,int const * 以及 int * const 的区别

const int * ,int const * 以及 int * const 的区别 const int * p; //保护p内容,常量的 int类型指针p int const * p; //保护p内容,int类型的 常量指针p int * const p; //保护p地址,int类型的 指针常量p const在的左边,保护内容 const在的右边,保护地址 由于保护地址,所以在初始化的时候就需...

小马哔哔 973

const int *pi与int *const pi 的区别

1.const的作用 我们可以先看一段代码,看一下const的作用 //代码4.1 #include <iostream> int main() { using namespace std; int i = 20; i = 40; cout << i <<endl; return 0; } //代码4.2 #include <iostream> int main() { using namespace

null1024的博客 304

C语言 const int* pi 和 int* const pi的区别

我们区分 const int* pi 和 int* const pi 的最简单的、最直接的办法是看变量 pi 前面是什么,就是说看pi 和什么先结合,就得到了 pi 本身的属性 和 被指向变量的属性。这样解决问题就 Just so so 了!

Mr.nie的博客 352

c语言中 int和const int的区别

一、const int 和int 的区别 具体的是 int定义的是一个变量,不需要初始化const int定义的是常量,需要初始化 1、返回值 const int & 是返回这个数值的一个常量的引用。 而int 是返回这个数值的一个拷贝。 int 是进行拷贝构造,而const int & 是返回的引用。拷贝构造更消耗时间,与此同时还用析构函数。因为产生了一个拷贝,你就可以轻易地修改拷贝的内容。 2、取指针 const int类型一旦定义以后就不能修改,int类型是随时可以修改的

m0_73964151的博客 1万+

const int *pi、int const *pi 与 int *const pi的区别

1 从const int i 说起     你知道我们申明一个变量时像这样int i ;这个i是可能在它处重新变赋值的。如下: int i=0; //… i=20;//这里重新赋值了     不过有一天我的程序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 。 //*************

Experience set us apart! 859

指针与const限定符 const int * p 与 int * const p 的 区别

先看 const int a = 2;    a的值是只读。 const int * p 与 int * const p 的 区别 ,。 可以这样理解:以*为分界点把变量分成两部分, 看const修饰谁。 const int * p:const 修饰的是int 所以 把const int 看成是一种类型,很显然 这种类型的内存是只读的。p指针本身不是只读 int * const p:c

yefengxuelang的专栏 1572

C++中const int * 和 int * const 及void *

#include<iostream> using namespace std; // 可传入任意类型的指针 void* test_void(void* v) { cout << v; //输出地址 cout << *(int *)v; //获取值 int i = 3; int* pi = &i; return pi; //可以返回任意类型指针...

weixin_43868436的博客 1347
上一篇: 代码小工具
下一篇: Android中AsyncTask
FreeYandroid
博客等级 码龄15年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值