0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:嵌入式ARM 2021-02-10 17:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

很多人遇到指针就糊涂,搞不清到底指向什么,其实是你没搞清楚 * 修饰谁,还有一些关键字修饰谁。

看下面的例子,定义一个无符号字符变量x,然后同时定义一个可以指向x的指针p,即可以将x的地址放到指针变量p里面,然后又定义了一个可以存放p地址的指针pp:

#include "stdio.h"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);}
很多时候还会遇到const关键字,很多人不知道该如何结合,到底const修饰谁?
这里你可以将定义看成是从右到左的结合。

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

86b8d9bc-5f65-11eb-8b86-12bb97331649.png

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

88bf8bca-5f65-11eb-8b86-12bb97331649.png

上面的报错信息意思是赋值错误,'='的操作数有不兼容的类型'int *'和'int',分配到了固定的地址。该固定的地址是不可以被修改的。

另外需要注意,如果一个变量定义为指向常量的指针,那么该指针还是可以指向一个可变的变量,但是无法通过该指针修改该变量。该变量的属性就是通过它操作指向的变量都当做不可修改常量看待。

报错内容如下:

896c439c-5f65-11eb-8b86-12bb97331649.png


8cd76cc8-5f65-11eb-8b86-12bb97331649.png

最后奉上,注释掉不合法的语句后的完整学习代码
#include "stdio.h"
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存放的地址不能变。        */}

责任编辑:xj

原文标题:指针的应用,一个简单例子讲清楚你多年的糊涂

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指针
    +关注

    关注

    1

    文章

    484

    浏览量

    71676
  • CONST
    +关注

    关注

    0

    文章

    45

    浏览量

    8683

原文标题:指针的应用,一个简单例子讲清楚你多年的糊涂

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    别再迷糊了!Linux交叉编译到底是啥?讲清楚

    很多工程师第次听到“交叉编译”这4字时,脑袋里往往会冒出两个字: 抽象 。 明明写代码写得好好的,为啥还要搞“交叉”?编译不就是把源代码变成可执行程序吗,难道还会绕几个弯? 别
    的头像 发表于 12-03 16:28 391次阅读
    别再迷糊了!Linux交叉编译到底是<b class='flag-5'>个</b>啥?<b class='flag-5'>一</b>文<b class='flag-5'>讲清楚</b>

    UPS不间断电源6kva多少钱?弄懂这几点,每分钱都花在刀刃上!

    范围极大,取决于您的实际需求。今天,我们就来彻底讲清楚,影响台6kVAUPS价格的核心因素,帮助您做出最明智的投资。、价格差异巨大:从几千到上万,为何悬殊?1
    的头像 发表于 11-25 10:32 127次阅读
    UPS不间断电源6kva多少钱?弄懂这几点,每<b class='flag-5'>一</b>分钱都花在刀刃上!

    讲清楚TVS二极管的作用和分类

    TVS二极管(Transient Voltage Suppression Diode,瞬态电压抑制二极管)是种专门用于抑制电路中瞬态过电压的半导体器件,其核心作用是通过快速响应和低钳位电压保护
    的头像 发表于 11-18 16:41 1343次阅读
    <b class='flag-5'>一</b>文<b class='flag-5'>讲清楚</b>TVS二极管的作用和分类

    讲清楚线性霍尔灵敏度和输出关系

    线性霍尔灵敏度与输出范围的关系解析 、核心定义与物理基础 灵敏度(Sensitivity) 线性霍尔传感器的灵敏度(单位:mV/mT 或 mV/G)表示单位磁场强度变化时输出电压的变化量。例如
    的头像 发表于 11-18 16:38 449次阅读

    GPIO、PWM、ADC,到底怎么区分?

    在嵌入式开发中,我们经常听到GPIO、PWM、ADC这些术语。初学者常常搞不清楚它们的区别和用途:“它们不是都是和电平有关吗?为什么还要分这么多种?”今天,我们就把这些基础概念讲清楚,让你在动手开发
    的头像 发表于 11-14 10:28 226次阅读
    GPIO、PWM、ADC,到底怎么区分?

    工业级防爆型PDA手持终端(化工/石油/矿场等场景)的实操指南

    今天讲防爆型PDA手持终端,主要会讲到:为什么要用防爆PDA、它们到底怎么防爆、要看哪些证书与参数、不同场景的选型与落地注意点、以及采购/验收/运维清单”都会尽量讲清楚
    的头像 发表于 11-04 15:02 269次阅读
    工业级防爆型PDA手持终端(化工/石油/矿场等场景)的实操指南

    智能水表正确使用方法:别让好设备用成“摆设”

    、管理方三角度,讲清楚智能水表的正确使用方法。、安装阶段:基础打牢,后续无忧1.安装方向要对水表外壳有水流箭头,必须与管道水流方向致;装反了不仅不走数,还可能
    的头像 发表于 10-21 15:23 338次阅读
    智能水表正确使用方法:别让好设备用成“摆设”

    CSD船用变压器铁芯硅钢片,真能扛住盐雾和振动吗?

    变压器就要拆下来返工,码头多停天,成本就多烧天。今天,我们就把硅钢片在船用环境里的真实表现,拆开来讲清楚。硅钢片到底是什么?简单说,它是
    的头像 发表于 08-23 09:44 585次阅读
    CSD船用变压器铁芯硅钢片,真能扛住盐雾和振动吗?

    阿里云设备的物模型数据里面始终没有值是哪里的问题?

    如上图,不知道讲清楚没有。 IG502自定义TOPIC 上发到阿里云没问题。采用阿里云物模型的格式来上发就不行。请大佬指教!
    发表于 08-05 06:43

    文了解什么是 BQB 认证

    讲清楚、什么是BQB认证?BQB是BluetoothQualificationBody的缩写,即“蓝牙资格认证”。它是由**蓝牙技术联盟(BluetoothSI
    的头像 发表于 07-18 14:53 1320次阅读
    <b class='flag-5'>一</b>文了解什么是 BQB 认证

    讲清楚芯片的分类-多个维度

    芯片作为现代电子设备的核心组件,其分类方式多样,以下从功能、应用领域、制造工艺、集成度、设计架构、用途、数据类型、工作方式、材料及封装形式十维度进行详细阐述: 、按功能分类 1. 处理器芯片
    的头像 发表于 05-06 15:04 5119次阅读

    函数指针的六常见应用场景

    函数指针在嵌入式开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数指针正是实现这需求的重要工具。本文将介绍六
    的头像 发表于 04-07 11:58 1130次阅读
    函数<b class='flag-5'>指针</b>的六<b class='flag-5'>个</b>常见应用场景

    Intel为什么在2015年收购Altera?现在又为什么抛弃Altera

    在写这篇文章时,我想了很多标题,但总感觉没有哪个能把文章的意思全都总结清楚的,所以我又起了副标题:断臂求生的Intel。 要讲清楚Intel为什么要收购Altera,现在又为什么抛弃,需要从很多
    的头像 发表于 02-07 11:22 1283次阅读
    Intel为什么在2015年收购Altera?现在又为什么抛弃Altera

    讲清楚电动汽车充电系统

    充电系统是新能源汽车主要的能源供给系统,为保障车辆持续行驶提供动力能源。电动汽车的充电系统是新能源转型的关键组成部分,直接影响着车辆的使用体验与效率。根据电动汽车动力蓄电池的技术特性和使用性质,其充电模式主要分为常规充电、快速充电和快速换电三种。常规充电(慢充):使用交流电,由外部电网提供220V民用单相交流电给电动汽车车载充电机,再由车载充电机给动力电池充
    的头像 发表于 01-24 16:58 4336次阅读
    <b class='flag-5'>一</b>文<b class='flag-5'>讲清楚</b>电动汽车充电系统

    桃芯科技软件审核简介

    本文档对如何审核项目的软件是否符合量产要求进行阐述;审核目的为确保软件足够健全、稳定、易于量产,做出更有品质的产品;该文档不一定会讲清楚每个检测项,但会尽可能提示你如何掌控调整方向。
    的头像 发表于 01-24 09:24 766次阅读