很多人遇到指针就糊涂,搞不清到底指向什么,其实是你没搞清楚 * 修饰谁,还有一些关键字修饰谁。
看下面的例子,定义一个无符号字符变量x,然后同时定义一个可以指向x的指针p,即可以将x的地址放到指针变量p里面,然后又定义了一个可以存放p地址的指针pp:
很多时候还会遇到const关键字,很多人不知道该如何结合,到底const修饰谁?int main(void){//无符号字符变量x,指向无符号字符变量类型的指针p,指向指针类型p的指针pp.unsigned char x,*p,**pp;x=12;p=&x;pp=&p;//const是修饰指针指向的对象属性,意思是指针kp只能指向一个const常量,而kp可以被修改指向不同的const常量,但是不能通过kp指针修改指向变量的值。int const *kp,k=20,kv=32;kp=&k;kp=&kv;//const是修饰指针mp,mp将指向固定的地址,因此在定义的时候就应该指定好该地址,之后无法修改该指针内的地址。int mv=14;int *const mp=&mv;//可以让kp指向mv的地址,但是不能通过kp,修改mv的值;kp=&mv;/*总结: const *p 表示*p是一个整体,即指针p指向的某个变量,而const修饰该变量;* const p表示const p是一个整体,const 修饰指针p,即指针p存放的地址不能变。*/printf("*p=%d ",*p);printf("**pp=%d ",**pp);printf(" p=%d ",p);printf("pp=%d ",pp);printf("pp=%d ",&pp);}
这里你可以将定义看成是从右到左的结合。
int const *kp;
int *const mp;
例如例子中的这两个,你看好了,从右到左
int const (*kp);
int *(const mp);
第一个括号里是表示kp指针指向的某个变量,该变量是个const常量,不可变。
第二个是const直接修饰了指针mp,意思是指针存放的内容是不可变的,就是地址不可变。
*与&是一对逆操作,*的出现用于定义指针,在使用的时候用于通过指针找到指向的变量。
而&用于取出变量的地址。
在PC测试上,推荐一个C语言的IDE,是C语言入门圣经C primer plus上推荐的一款:Pelles C IDE

如果想使用中文界面可以访问下面这个中文链接:https://www.pellesc.cn/
例如一个指向固定地址的指针,若想修改它指向的地址,那么会报错

上面的报错信息意思是赋值错误,'='的操作数有不兼容的类型'int *'和'int',分配到了固定的地址。该固定的地址是不可以被修改的。
另外需要注意,如果一个变量定义为指向常量的指针,那么该指针还是可以指向一个可变的变量,但是无法通过该指针修改该变量。该变量的属性就是通过它操作指向的变量都当做不可修改常量看待。
报错内容如下:


最后奉上,注释掉不合法的语句后的完整学习代码
int main(void){//无符号整形变量x,指向无符号整形变量类型的指针p,指向指针类型p的指针pp.unsigned int x,*p,**pp;x=12;p=&x;pp=&p;printf("通过指针p,打印x的值12:*p=%d ",*p);printf("通过指针pp,打印pp存放的指针p指向的变量x的值:**pp=%d ",**pp);printf("打印变量x的地址: &x=%p ",&x);printf("打印指针p存放的变量x的地址:p=%p ",p);printf("打印指针p的地址: pp=%p ",pp);printf("打印指针变量pp的地址: pp=%p ",&pp);printf("-------------------------------------------- ");//const是修饰指针指向的对象属性,意思是指针kp只能指向一个const常量,而kp可以被修改指向不同的const常量,但是不能通过kp指针修改指向变量的值。int const *kp,k=20,kv=32;kp=&k;printf("通过指针kp访问固定的数k,*kp=%d ",*kp);kp=&kv;printf("通过指针kp访问固定的数kv,*kp=%d ",*kp);// 通过kp不可以修改指向地址存放变量的固定值。// *kp=21;//const是修饰指针mp,mp将指向固定的地址,因此在定义的时候就应该指定好该地址,之后无法修改该指针内的地址。int mv=14,mx=24;int *const mp=&mv;printf("通过存放固定地址的指针访问指向的变量mv=14:*mp=%d ",*mp);*mp=15;printf("通过存放固定地址的指针修改指向的变量mv=15:*mp=%d ",*mp);//可以让kp指向mv的地址,但是不能通过kp,修改mv的值;kp=&mx;printf("将指向固定数据的指针kp指向一个可以修改的变量mx=24,*kp=%d ",*kp);// 试图通过指向固定常量的指针kp修改指向的可修改变量mx时候,失败了。// *kp=25;//因为mp指针指向的地址是const类型,所以下面的操作是非法的,会报错。// mp=&24;/*总结: const *p 表示*p是一个整体,即指针p指向的某个变量,而const修饰该变量;* const p表示const p是一个整体,const 修饰指针p,即指针p存放的地址不能变。*/}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
指针
+关注
关注
1文章
484浏览量
71676 -
CONST
+关注
关注
0文章
45浏览量
8683
原文标题:指针的应用,一个简单例子讲清楚你多年的糊涂
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
别再迷糊了!Linux交叉编译到底是个啥?一文讲清楚
很多工程师第一次听到“交叉编译”这4个字时,脑袋里往往会冒出两个字: 抽象 。 明明写代码写得好好的,为啥还要搞一个“交叉”?编译不就是把源代码变成可执行程序吗,难道还会绕几个弯? 别
UPS不间断电源6kva多少钱?弄懂这几点,每一分钱都花在刀刃上!
范围极大,取决于您的实际需求。今天,我们就来彻底讲清楚,影响一台6kVAUPS价格的核心因素,帮助您做出最明智的投资。一、价格差异巨大:从几千到上万,为何悬殊?1
一文讲清楚TVS二极管的作用和分类
TVS二极管(Transient Voltage Suppression Diode,瞬态电压抑制二极管)是一种专门用于抑制电路中瞬态过电压的半导体器件,其核心作用是通过快速响应和低钳位电压保护
一文讲清楚线性霍尔灵敏度和输出关系
线性霍尔灵敏度与输出范围的关系解析 一、核心定义与物理基础 灵敏度(Sensitivity) 线性霍尔传感器的灵敏度(单位:mV/mT 或 mV/G)表示单位磁场强度变化时输出电压的变化量。例如
GPIO、PWM、ADC,到底怎么区分?
在嵌入式开发中,我们经常听到GPIO、PWM、ADC这些术语。初学者常常搞不清楚它们的区别和用途:“它们不是都是和电平有关吗?为什么还要分这么多种?”今天,我们就把这些基础概念讲清楚,让你在动手开发
工业级防爆型PDA手持终端(化工/石油/矿场等场景)的实操指南
今天讲防爆型PDA手持终端,主要会讲到:为什么要用防爆PDA、它们到底怎么防爆、要看哪些证书与参数、不同场景的选型与落地注意点、以及采购/验收/运维清单”都会尽量讲清楚
智能水表正确使用方法:别让好设备用成“摆设”
、管理方三个角度,讲清楚智能水表的正确使用方法。一、安装阶段:基础打牢,后续无忧1.安装方向要对水表外壳有水流箭头,必须与管道水流方向一致;装反了不仅不走数,还可能
阿里云设备的物模型数据里面始终没有值是哪里的问题?
如上图,不知道讲清楚没有。 IG502自定义TOPIC 上发到阿里云没问题。采用阿里云物模型的格式来上发就不行。请大佬指教!
发表于 08-05 06:43
一文讲清楚芯片的分类-多个维度
芯片作为现代电子设备的核心组件,其分类方式多样,以下从功能、应用领域、制造工艺、集成度、设计架构、用途、数据类型、工作方式、材料及封装形式十个维度进行详细阐述: 一、按功能分类 1. 处理器芯片
函数指针的六个常见应用场景
函数指针在嵌入式开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数指针正是实现这一需求的重要工具。本文将介绍六个
Intel为什么在2015年收购Altera?现在又为什么抛弃Altera
在写这篇文章时,我想了很多标题,但总感觉没有哪个能把文章的意思全都总结清楚的,所以我又起了副标题:断臂求生的Intel。 要讲清楚Intel为什么要收购Altera,现在又为什么抛弃,需要从很多
一文讲清楚电动汽车充电系统
充电系统是新能源汽车主要的能源供给系统,为保障车辆持续行驶提供动力能源。电动汽车的充电系统是新能源转型的关键组成部分,直接影响着车辆的使用体验与效率。根据电动汽车动力蓄电池的技术特性和使用性质,其充电模式主要分为常规充电、快速充电和快速换电三种。常规充电(慢充):使用交流电,由外部电网提供220V民用单相交流电给电动汽车车载充电机,再由车载充电机给动力电池充
桃芯科技软件审核简介
本文档对如何审核一个项目的软件是否符合量产要求进行阐述;审核目的为确保软件足够健全、稳定、易于量产,做出更有品质的产品;该文档不一定会讲清楚每个检测项,但会尽可能提示你如何掌控调整方向。

一个简单例子讲清楚指针的应用
评论