C语言指针变量作为函数参数

来源:互联网 发布:淘宝图片尺寸大小 编辑:程序博客网 时间:2024/05/17 04:13

参考:http://c.biancheng.net/cpp/html/74.html

在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。

有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。

有些初学者可能会使用下面的方法来交换两个变量的值:

#include <stdio.h>void swap(int a, int b){    int temp;  //临时变量    temp = a;    a = b;    b = temp;}int main(){    int a = 66, b = 99;    swap(a, b);    printf("a = %d, b = %d\n", a, b);    return 0;}
运行结果:
a = 66, b = 99

从结果可以看出,a、b 的值并没有发生改变,交换失败。这是因为 swap() 函数内部的 a、b 和 main() 函数内部的 a、b 是不同的变量,占用不同的内存,它们除了名字一样,没有其他任何关系,swap() 交换的是它内部 a、b 的值,不会影响它外部(main() 内部) a、b 的值。

改用指针变量作参数后就很容易解决上面的问题:
运行结果:
a = 99, b = 66

调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 本身,交换 *p1、*p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。

需要注意的是临时变量 temp,它的作用特别重要,因为执行*p1 = *p2;语句后 a 的值会被 b 的值覆盖,如果不先将 a 的值保存起来以后就找不到了。

用数组和变量作函数参数例子

u8 canreceive[8];
uint32_t ID;
//函数
u8 Can_Receive_Msg(u8 *buf,uint32_t *id){      u32 i;CanRxMsg RxMessage;    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);if(RxMessage.StdId==0x390){for(i=0;i<8;i++)    buf[i]=RxMessage.Data[i];     *id=RxMessage.StdId;}if(RxMessage.StdId==0x190){for(i=0;i<8;i++)    buf[i]=RxMessage.Data[i]; *id=RxMessage.StdId;}return RxMessage.DLC;}
key=Can_Receive_Msg(canreceive,&ID);//调用

原创粉丝点击