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

C/C++编程语言 专栏收录该内容
53 篇文章 68 订阅

本文主要介绍在 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 的交换。

  • 2
    点赞
  • 0
    评论
  • 20
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页

打赏作者

liitdar

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值