stm32语言c指针吗,C指针+ STM32 理解

本文详细探讨了C语言中指针的存储、类型以及在寄存器层次上的工作原理,通过示例代码展示了不同类型的指针变量如何存储和访问。同时,文章解释了函数参数传递的值传递和地址传递方式,并通过示例代码分析了两者的区别。重点讨论了在IAR环境下,指针变量在内存中的布局和如何通过反汇编查看函数调用的效果。此外,提到了堆栈的作用以及引用在嵌入式C语言中的缺失。
摘要由CSDN通过智能技术生成

环境:IAR + Cortex-M3的处理器

关注:指针在寄存器层次上的存储、调用等。。。

推荐:让你不再害怕指针

存储:

示例代码如下:

int yyy=16;

int *ptr1 = &yyy;

int **ptr2 = &ptr1;

int (*ptr3)[3];

int *(*ptr4)[4];

int main()

{

................

//使用这几个变量

.................

return 0;

}

IAR--View--Statics显示的全局区(静态区)情况:

097fd34258caea578b4240ac1865add9.png

以ptr2来说,定义:int **ptr2 = &ptr1;

从上图可知,指针变量ptr2的类型,即指针的类型:int ** ;指针ptr2所指向的类型:int*;相应的 (*ptr) 所指向的类型:int*.......

变量ptr2 存放在 地址:0x2000 0008位置,内容:0x2000 0004; 变量*ptr2 存放在 地址:0x2000 0004位置,内容:0x2000 0000; 变量**ptr2 存放在 地址:0x2000 0000位置,内容:16(0x10);

查看内存(Memory):

5cdce23d808152e6bc22c74d2baed0cf.png

操作:

首先理解 函数的 参数传递方式:值传递、地址传递、引用传递。

资料:http://pan.baidu.com/s/1bnvZTTl

一个预备的常识:

为了说明这个问题,先给出一个代码:

int a=4;

int x;

x=a;

x=x+3;

看好了没,现在我问你:最终a值是多少,x值是多少?

(怎么搞的,给我这个小儿科的问题。还不简单,不就是a==4 x==7嘛!)

在这个代码中,你要明白一个东西:虽然a值赋给了x,但是a变量并不是x变量哦。我们对x任何的修改,都不会改变a变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。

其他的,看上边的资料链接。

实例:两个变量的数值交换。C代码如下:

#include "stdio.h"

void Exchg1(int x, int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

//printf("x=%d,y=%dn",x,y);

}

void Exchg2(int *px, int *py)

{

int tmp=*px;

*px=*py;

*py=tmp;

//printf("*px=%d,*py=%dn",*px,*py);

}

void main()

{

int a=4,b=6;

Exchg1 (a,b) ;

//printf("a=%d,b=%d n",a,b);

Exchg2(&a,&b);

//printf("a=%d,b=%d n",a,b);

}

IAR的 反汇编代码:

a4a256b58cb92d9956172545c52f649b.png

图3:由下图能够看出 Exchg1 ()函数 为值传递 的参数调用

5ba2f8b7a7c85806bf6c38722e1a5b94.png

图4:函数执行后,值没有变化。

5dc526a0c81d9050b1fe73323b1cd858.png

-------------------------------------

图5:由下图能够看出 Exchg2 ()函数 为地址传递 的参数调用

9027e048c1daa1c819f5ecf0513af66e.png

图6:函数调用后,变量的值已发生交换....

ea0d1a8247dd79a7d4c5226fd2766f62.png

其他:

关于 堆、栈的作用、理解,可以参考我转载过来的文章: stm32 堆和栈(stm32 Heap & Stack)。

另外注意:引用的概念在嵌入式C语言中不存在。

*************************************************************

以上......................................

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值