指针在函数中的应用
< 完美的传递>
函数调用时,数据传递是不可避免的:
函数是完成某项特定功能的程序块,函数操作的基础是数据,故函数调用也是为了操作这些数据,以完成相应的功能。
函数调用时传递的数据,就是所谓的函数参数。可分为
一:传递的是变量的数值(普通参数)
二:传递的是变量的地址(指针参数)<—> 传递的是指针变量的数值
在c中,函数传递总是单向的值传递------指针参数的传递解决了单向值传递问题
为啥说函数传递总是单向的值传递?eg 例3-1
#include <stdio.h>
typedef unsigned char u8; //定义一个u8的无符号字符型
void Swapdata(u8 data_x,u8 data_y); //声明交换函数
int main(void)
{
u8 x=2;
u8 y=3;//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(u8 data_x,u8 data_y) //data_x,data_y为形参
{
u8 temp; //临时变量
temp = data_x; //暂存data_x的值
data_x = data_y;
data_y = temp;
}
x=2 , y=3
x=2 , y=3
为什么值没有交换?? 我们稍微修改一下 eg 例3-2
#include <stdio.h>
typedef unsigned char u8; //定义一个u8的无符号字符型
void Swapdata(u8 data_x,u8 data_y); //声明交换函数
int main(void)
{
u8 x=2;
u8 y=3;//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(u8 data_x,u8 data_y) //data_x,data_y为形参
{
u8 temp; //临时变量
printf("x=%d , y=%d \n",data_x,data_y); //交换前
temp = data_x; //暂存data_x的值
data_x = data_y;
data_y = temp;
printf("x=%d , y=%d \n",data_x,data_y); //交换前
}
x=2 , y=3
x=3 , y=2
现在交换了? 看一下有什么区别,3-1 打印的是实参,3-2打印的是形参
也就是说 : 实参的值传递给了形参,但形参的值没有传递给实参 === 函数单向值得传递
通俗易懂就是 形参的值是实参copy过来的 所以形参值变化没有影响实参的值变化
狼来了------放羊孩子说到:如果把指针作为函数参数进行传递会怎样?eg 例3-3 (明知故问)
#include <stdio.h>
typedef unsigned char u8; //定义一个u8的无符号字符型
void Swapdata(u8 *data_x,u8 *data_y); //声明交换函数
int main(void)
{
u8 x=2;
u8 y=3;//x,y为实参
u8 *p_x,*p_y;
p_x = &x; //初始化指针变量 p_x指向变量x
p_y = &y; //初始化指针变量 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(u8 *data_x,u8 *data_y) //data_x,data_y为形参
{
u8 temp; //临时变量
temp = *data_x; //暂存data_x的值
*data_x = *data_y;
*data_y = temp;
}
x=2 , y=3
x=3 , y=2
**从执行结果可知道,x,y的值的确交换了 这是为什么呢??
前者传递变量的数值,后者传递变量的地址 函数Swapdata(u8 data_x,u8 data_y)操作的是变量地址
那么变量地址是不变的,但地址中存储的值交换 故而,(你在我家,我在你家)数值也就达到了交换的目的