单片机c语言的指针,一直没明单片机C语言的指针这块内容,在什么情况下会用到指针呢?...

180253975_1_20200112111126174

作为一名长期使用C语言进行开发的老司机,我来回答一下C语言指针的问题。

首先、C语言指针的本质是什么?

C语言指针的本质是内存变量,是内存单元的编号。内存单元是以字节为单位的。所以指针就是字节的编号。如下图所示,一个4G内存的编号,指针的值其实就是内存编号。

180253975_2_20200112111126267

其次、搞清楚变量和指针的关系

变量对应的是具体的内存,变量的内容就是内存中保存的数据。

比如,我们定义一个变量uint8_t a=10,假如a的位置是0,也就是上图中0位置的内存中保存的数据是10;

我们再来看指针,定义指针uint8_t * b=&a,我们知道&的含义是取地址,那么根据上面的假设变量a位于地址0,那么&a也就是0,此时指针变量b的值也就是0.

如果不好理解指针定义uint8_t * b=&a,我们可以变通一下:

(uint8_t *) b =&a,把(uint8_t *) 当做一个新的数据类型就好理解了,其实我们实际的编程中,也通常会这么定义:typeof uint8_t * uint8_p

uint8_p b=&a;

这样 b就更像是一个变量了,理解起来更容易了。

第三、指针单元和内存

指针每个单元代表多少个内存呢?这要看指针的类型

比如,char * a,short int * b,int *c,long int * d等

指针所指的每份内存数量为1个字节,2个字节,4个字节,8个字节,也就是每个变量类型所占的内存单元。

假设a、b、c、d四个指针变量值均为100,分别做自加运算后,指针的值是多少呢?

a++;

b++;

c++;

d++;

你能猜出,a、b、c、d的值分别是多少吗?

答案是:101,102,104,108.

也就是每次指针移动一个变量类型对应的内存数,这个可以在keil 开发环境上面通过模拟环境验证,有兴趣的可以自行验证一下。

最后、指针的优势和应用场景

优势:

1.效率高;2、灵活,可以访问任意位置的内存数据;3、作为函数参数传递,只需要传递4个字节,比数组传值节省内存拷贝时间。

应用场景:

1.函数中交换两个变量的值

180253975_3_20200112111126361

在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值。如果传递的是指针就没有问题。因为指针传递过去的是两个变量的地址,变量的位置不变。

2.函数通过指针返回多个值

3.函数返回运算的状态,结果通过指针返回

…………

180253975_4_20200112111126424

指针的弊端

指针是C语言的灵魂所在,通常说C语言是“低级”语言的原因,很大程度上也是因为C语言指针的问题,C语言指针让开发者可以访问任意内存位置的数据。这是其他语音没有办法达到的。也正因为指针,C语言也很容易出错,最常见的问题是地址越界,如果地址越界,读写了不该读写的内容会直接导致系统崩溃,而且这种问题很难定位,因为语法上是没有错误的,编译的时候无法检查出来。

对于C语言指针的问题,大家有什么意见,欢迎留言讨论。

180253975_5_20200112111126502

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值