C指针(2)——指针在函数中的应用(程序讲解)
程序员文章站
2024-02-03 11:42:16
3-1.c指针用作函数参数 目的:是为了通过swapdate()函数把实参x,y的值进行交换,上述例子是将形参dat_x,dat_y的值进行交换,但是形参的交换并没有改变实参的交换,因为函数在调用时给形参分配了单独的内存空间,实参的值传递给形参实际是把实参的值放在形参的内存空间,形参的值是实参的备份 ......
3-1.c指针用作函数参数
#include<stdio.h> typedef unsigned char uint8_t; //类型自定义,通过typedef语句重新把unsigned char命名为uint8_t,目的为了方便 extern void swapdata(uint8_t dat_x,uint8_t dat_y); int main(void) { uint8_t x,y; printf("请输入x,y:"); scanf("%d,%d",&x,&y); printf("交换前:x=%d,y=%d\n",x,y); swapdata(x,y); printf("交换后:x=%d,y=%d\n",x,y); return 0; } void swapdata(uint8_t dat_x,uint8_t dat_y) { uint8_t temp; temp=dat_x; dat_x=dat_y; dat_y=temp; }
目的:是为了通过swapdate()函数把实参x,y的值进行交换,上述例子是将形参dat_x,dat_y的值进行交换,但是形参的交换并没有改变实参的交换,因为函数在调用时给形参分配了单独的内存空间,实参的值传递给形参实际是把实参的值放在形参的内存空间,形参的值是实参的备份,因此形参交换,实参并不会交换,不能达到交换实参的目的。
结果:
请输入x,y:30,20 交换前:x=30,y=20 交换后:x=30,y=20
3-2 函数调用时,把指针作为函数参数进行传递,即传递变量的地址。在被调函数中,通过指针操作相应的变量,实际操作变量本身。在被调函数中对形参的操作实际就是对实参的操作。
#include <stdio.h> typedef unsigned char uint8_t; extern void swapdata(uint8_t *dat_x,uint8_t *dat_y); //函数参数变成指针 int main(void) { uint8_t x,y; uint8_t *p_x,*p_y; printf("请输入x,y:"); scanf("%d,%d",&x,&y); p_x=&x; p_y=&y; printf("交换前:x=%d,y=%d\n",x,y); swapdata(p_x,p_y); printf("交换后:x=%d,y=%d\n",x,y); return 0; } void swapdata(uint8_t *dat_x,uint8_t *dat_y) //形参为两个指针变量,目的是为了承接实参的值,实参是指针类型, { uint8_t temp; temp=*dat_x; //通过取值运算符*与指针变零dat_x结合,访问实参x;调用swapdate()后,指针变量dat_x指向实参x,对*dat_x的操作实际是对实参x的操作。 *dat_x=*dat_y; *dat_y=temp; }
结果:
请输入x,y:10,20 交换前:x=10,y=20 交换后:x=20,y=10
对比3-1和3-2的根本区别是:前者调用函数,实参是x,y的值;后者调用函数时,实参是x,y的指针,即二者的地址。
结论:要在被调函数中改变主调函数中的变量值,需要将主函数中变量的指针作为实参,传递给被调函数。