C/C++编程语言中指针变量作为函数参数的方法

本文通过几个示例程序,介绍在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

对于上述代码及其运行结果,说明如下:

  1. 指针作为函数参数时,实际上是将变量的地址传给函数;
  2. 需要注意:函数swap的形参的定义形式为“int *p1”;而调用该函数时,实参形式为指针(变量地址)“pointer_1”。
  3. 函数swap的作用是交换两个变量(“a”和“b”)的值,其实现方法是通过交换指针变量所指向的值(*p1和*p2),而并非交换指针变量自身值(p1和p2)。这是因为:函数参数传递的方式是“单向值传递”的“值传递”方式(指针变量作为函数参数也是遵循这一规则),形参值(p1和p2)的改变不能使实参的值(pointer_1和pointer_2)随之改变,即,受“单向值传递”约束的只是指针变量(pointer_1和pointer_2),而指针变量(pointer_1和pointer_2)所指向的值(“a”和“b”)并不受约束。因此,可以通过指针变量作为函数参数的方式,改变指针变量所指向的参数值;
  4. 函数的调用可以(而且只可以)得到一个返回值(即函数值),而运用指针变量作为函数参数,可以得到多个变化的值。

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的交换。

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liitdar

赠人玫瑰,手有余香,君与吾共勉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值