[demo程序] 单片机指针作为函数形式参数使用解析

[复制链接]
 楼主| LM莫 发表于 2020-8-25 19:33 | 显示全部楼层 |阅读模式
(1)、单片机指针作为函数形式参数的作用
在单片机c语言中,实际参数和形式参数之间的数据传输是单向的“值传递”方式,也就是实际参数可以影响形式参数,而形式参数不能影响实际参数。而单片机指针作为函数形式参数,可以改变实际参数的变量值,可以解决不能用一个形式参数表示数组或字符串或动态分配的内存等一系列数据的集合传入函数内部的问题,也就是把函数的形式参数声明成指针,这样就可以把数组或字符串或动态分配的内存等一系列数据的集合传入函数内部。

 楼主| LM莫 发表于 2020-8-25 19:34 | 显示全部楼层
(2)、单片机指针作为函数形式参数来改变实际参数变量值的单片机C语言程序
  1. #include<reg51.h>
  2. #include <stdio.h>
  3. int a=1;
  4. int b=2;
  5. int *pa=&a;//表示把实际参数变量a所在内存地址(由内存器分配)存放的数据1赋给指针变量pa
  6. int *pb=&b;//表示把实际参数变量b所在内存地址(由内存器分配)存放的数据2赋给指针变量pb
  7.   void Swap0(int x,int y)//含有普通形式参数变量的函数
  8. {
  9.    int t;
  10.    t=x;//实际参数变量a把数值1赋给形式参数变量x,形式参数变量x又把数值1赋给变量t。
  11.    x=y;//实际参数变量把数值2赋给形式参数变量y,形式参数变量y又把数值2赋给变量x。
  12.    y=t;//变量t把数值1赋给变量y
  13. //   printf("S2:x=%d,y=%d\n",x,y);
  14.   }
  15.   void Swap1(int *px,int *py)//含有形式参数指针变量的函数
  16. {
  17.    int t;
  18.    t=*px;//实际参数变量a先把所在内存地址(由内存器分配)赋给形式参数变量pa,形式参数变量pa再把携带实际参数变量a的内存地址(由内存器分配)赋给另外个形式参数指针变量px(相当于实际参数变量a),形式参数指针变量px(相当于实际参数变量a)最终从形式参数变量pa携带实际参数变量a的内存地址上获取数值1,赋给变量t。
  19.    *px=*py;//实际参数变量b先把所在内存地址(由内存器分配)赋给形式参数变量pb,形式参数变量pb再把携带实际参数变量b的内存地址(由内存器分配)赋给另外个形式参数指针变量py(相当于实际参数变量b),形式参数指针变量py(相当于实际参数变量b)最终从形式参数变量pb携带实际参数变量b的内存地址上获取数值2,赋给形式参数指针变量px(相当于实际参数变量a)。
  20.    *py=t;//变量t把数值1赋给指针变量py(相当于实际参数变量b)
  21. //   printf("S2:px=%d,py=%d\n",px,py);  
  22.   }
  23.   void Swap2(int *px,int *py)//含有指针形式参数的函数
  24. {
  25.    int *pt;//声明指针变量pt
  26.    pt=px;//实际参数变量a先把所在内存地址(由内存器分配)赋给形式参数变量pa,形式参数变量pa再把携带实际参数变量a的内存地址(由内存器分配)赋给另外个形式参数指针变量px(相当于实际参数变量a),形式参数指针变量px(相当于实际参数变量a)最终从形式参数变量pa携带实际参数变量a的内存地址赋给指针变量pt。
  27.    px=py;//实际参数变量b先把所在内存地址(由内存器分配)赋给形式参数变量pb,形式参数变量pb再把携带实际参数变量b的内存地址(由内存器分配)赋给另外个形式参数指针变量py(相当于实际参数变量b),形式参数指针变量py(相当于实际参数变量b)最终从形式参数变量pb携带实际参数变量b的内存地址赋给形式参数指针变量px(相当于实际参数变量a)。
  28.    py=pt;//指针变量pt把所在内存地址(由内存器分配)赋给指针变量py(相当于实际参数变量b)
  29. //   printf("S2:px=%d,py=%d\n",px,py);
  30.   }
  31.   void main(void)
  32. {
  33.    Swap0(a,b);
  34.    printf("S0:a=%d,b=%d\n",a,b);//输出:a=1,b=2。
  35.    Swap1(pa,pb);
  36.    printf("S1:a=%d,b=%d\n",a,b);//输出:a=2,b=1。
  37.    Swap2(pa,pb);
  38.    printf("S2:a=%d,b=%d\n",a,b);//输出:a=2,b=1。
  39.    while(1);
  40.   }


小丫小萝卜 发表于 2020-8-26 15:17 | 显示全部楼层
谢谢分享复制走
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

447

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部