本文通过几个示例程序,介绍在C/C++编程语言中,将指针变量作为函数参数的方法。
1 示例1
示例代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* 函数声明 */
int swap(int *p1, int *p2);
int a = 0;
int b = 0;
int i = 0;
int *pointer_1 = NULL;
int *pointer_2 = NULL;
printf("please input a and b: ");
scanf("%d %d", &a, &b);
/* 交换前a和b的值 */
printf("before swap: a=%d, b=%d\n", a, b);
pointer_1 = &a;
pointer_2 = &b;
i = swap(pointer_1, pointer_2);
/* 交换后a和b的值 */
printf("after swap: a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
/*
* 在此函数中实现指针变量的值的交换
*/
int swap(int *p1, int *p2)
{
int tmp = 0;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
return 0;
}
上述代码运行结果如下:
please input a and b: 11 33
before swap: a=11, b=33
after swap: a=33, b=11
对于上述代码及其运行结果,说明如下:
- 指针作为函数参数时,实际上是将变量的地址传给函数;
- 需要注意:函数swap的形参的定义形式为“int *p1”;而调用该函数时,实参形式为指针(变量地址)“pointer_1”。
- 函数swap的作用是交换两个变量(“a”和“b”)的值,其实现方法是通过交换指针变量所指向的值(*p1和*p2),而并非交换指针变量自身值(p1和p2)。这是因为:函数参数传递的方式是“单向值传递”的“值传递”方式(指针变量作为函数参数也是遵循这一规则),形参值(p1和p2)的改变不能使实参的值(pointer_1和pointer_2)随之改变,即,受“单向值传递”约束的只是指针变量(pointer_1和pointer_2),而指针变量(pointer_1和pointer_2)所指向的值(“a”和“b”)并不受约束。因此,可以通过指针变量作为函数参数的方式,改变指针变量所指向的参数值;
- 函数的调用可以(而且只可以)得到一个返回值(即函数值),而运用指针变量作为函数参数,可以得到多个变化的值。
2 示例2
对于示例1中的swap函数的实现方法,给出有一个典型的错误示例,代码内容如下:
/*
* swap函数的错误示例 *
*/
int swap_error(int *p1, int *p2)
{
int *tmp;
*tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
return 0;
}
上述代码在编译时不会报错,但运行时会直接导致程序崩溃。
目前猜测此问题的原因:*tmp是指针变量tmp所指向的变量,但*tmp中并无确定的值,因此tmp所指向的单元也是不可预见的。所以,对*tmp赋值有可能会对一个存储着重要数据的存储单元赋值,这样就会破坏系统的正常工作。
备注:上面所述只是猜测,并未证实。后续可通过GDB调试等方式,进一步确认此问题原因。
综上,建议如示例1那样,使用整型变量tmp作为临时变量来实现*p1和*p2的交换。