C指针+ STM32 理解

环境: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显示的全局区(静态区)情况:

 C指针+ STM32 理解_第1张图片

以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):

C指针+ STM32 理解_第2张图片



操作:

首先理解 函数的 参数传递方式:值传递、地址传递、引用传递。
资料: 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=%d\n",x,y);
}

void Exchg2(int *px, int *py)
{
  int tmp=*px;
  *px=*py;
  *py=tmp;
  //printf("*px=%d,*py=%d\n",*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的 反汇编代码:
C指针+ STM32 理解_第3张图片

图3:由下图能够看出 Exchg1 ()函数 为值传递 的参数调用
C指针+ STM32 理解_第4张图片
           

图4:函数执行后,值没有变化。
C指针+ STM32 理解_第5张图片

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

图5:由下图能够看出 Exchg2 ()函数 为地址传递 的参数调用
C指针+ STM32 理解_第6张图片

图6:函数调用后,变量的值已发生交换....
C指针+ STM32 理解_第7张图片


其他:

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

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


*************************************************************
以上......................................



































你可能感兴趣的:(OS篇,cortex-M3)