环境: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显示的全局区(静态区)情况:
以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):
操作:
首先理解 函数的 参数传递方式:值传递、地址传递、引用传递。
资料: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的 反汇编代码:
图3:由下图能够看出 Exchg1 ()函数 为值传递 的参数调用
图4:函数执行后,值没有变化。
-------------------------------------
图5:由下图能够看出 Exchg2 ()函数 为地址传递 的参数调用
图6:函数调用后,变量的值已发生交换....
其他:
关于 堆、栈的作用、理解,可以参考我转载过来的文章: stm32 堆和栈(stm32 Heap & Stack)。
另外注意:引用的概念在嵌入式C语言中不存在。
*************************************************************
以上......................................