在嵌入式中的各种指针用法和概念

  无情的搬砖机器= =

Ps:以下所有指针的概念的理解思路可以从字义层面上,从右到左进行理解。


  • 指针数组 : int *p1[10];
  • 数组指针 : int (*p2)[10];
    • 对应概念
      • 指针数组:一个存放多个指针的数组
      • 数组指针:一个指向数组的指针(首地址)
    • 对应用法
      • 指针数组:一般是存放多个指针分别指向各个不同的字符串,不同的指针可组合起来一段话。
      • 数组指针:一般是作为函数的数组形参,打印字符串可以只修改指向的字符串地址。
  • 结构体指针 :Student *p2;
  • 结构体数组指针 :Student (*p2)[10];
  • 结构体成员是指针:
    • 对应概念
      • 结构体指针:跟数组指针差不多
      • 结构体数组指针:跟指针数组差不多,存放多个结构体指针
      • 结构体成员是指针:跟普通数组差不多,但只是部分成员(元素)是指针
    • 对应用法
      • 结构体指针:普遍常用
      • 结构体数组指针:普遍常用,可对应不同驱动的通道号(例如两路硬件选择)
      • 结构体成员是指针:很常见,不过要注意初始化赋值

  • 指针函数: int *p3(int,int);
  • 函数指针:
    • int (*p4)(int,int);
    • char *(*pf)(char * p);
  • 传递指针: int p5(int*,int*)
    • 对应概念
      • 指针函数:一个返回值是 指针变量 的函数
      • 函数指针:一个指向函数的指针
      • 传递指针:函数形参是指针
    • 对应用法
      • 指针函数:不常用,有风险。不能返回局部变量指针,全局指针变量还需要返回吗?
      • 函数指针:相当于留出自定义函数接口,常用于回调函数 或 程序适应(选择)不同(硬件)版本的驱动(函数)
      • 传递指针:很常用,传入实参需要修改值时,就传入实参指针(数组退化被迫传入指针)

Ps:

  • 函数声明时,可以省略形参名,不能省略形参类型;
  • 函数定义(写函数体)时,则都不能省略。
  • 函数内部修改外部变量的值,需要一级指针;(函数形参)
  • 函数内部修改外部指针变量的值,需要二级指针。
  • 函数的实参和形参之间的传递是单向的,只能由实参向形参传递(拷贝传递)。被调函数调用完之后系统为其分配的内存单元都会被释放。我们在对常量,或者是指针进行操作的时候,实质上是对其对应的内存进行操作

  • 函数指针数组:
    • int (*p5[3])(int );
    • char *(*pf[3])(char *p);
  • 函数指针数组指针: char *(*(*pf[3])(char *p);
    • 对应概念
      • 函数指针数组:一个数组中,所有元素都是指针,且一个指针对应指向一个函数
      • 函数指针数组指针:一个指针,指向一个数组,这个数组中,所有元素都是指针,一个指针对应指向一个函数
    • 对应用法
      • 函数指针数组:一个数组存放多个不同版本的驱动、算法(函数)
      • 上面那个已经很极限了;这个真太花里胡哨,用不来,用的来也估计是埋坑给后面的
-------------本文结束感谢您的阅读-------------