十分钟拿下指针!指针变量作为函数参数如何运用?

函数的参数不仅可以是整形,浮点型等数据,也可以是指针类型。他的作用是将一个变量的地址传送到另一个函数中。

下面通过一个例子来说明:

我们采用函数来处理,而且用指针类型的数据做函数的参数

#include<stdio.h>
int main(){
    void swap(int * point_1,int * point_2);
    int *p1,*p2,a,b;

    printf("please enter two integer number:");
    scanf("%d,%d",&a,&b);
    p1 = &a;
    p2 = &b;
    if(a<b)
        swap(p1,p2);
// 如果 a < b,那么 a 和 b 的值进行了交换
// 如果打印了 *p1 和 *p2 我们会发现,p1 仍指向 a,p2 仍指向 b
    printf("max=%d,min=%d\n",a,b);

    return 0;
}

void swap(int * point_1,int * point_2){
    int temp;

// 注意:这里是交换指针所指变量的值
// 即指针的指向没有发生改变
// 但是变量 a 和 b 的值改变了
    temp = * point_1;                 //使 *p1 和 *p2 互换
    *point_1 = * point_2;
    *point_2 = temp;
}

程序分析:

swap 是用户自定义函数,它的作用是交换两个变量(a 和 b)的值。

swap 函数的两个形参 point_1 和 point_2 是指针变量。程序运行时,先执行 main 函数,输入 a 和 b 的值(我们输入的是 23 和 34),然后将 a 和 b 的地址分别赋给 int 指针变量 p1 和 p2,使 p1 指向 a,p2 指向 b,见下图 a,接着执行 if 语句,由于 a<b,因此执行 swap 函数。

注意实参 p1 和 p2 是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是“值传递”方式。因此虚实结合后形参 point_1 的值是 &a,point_2 的值为 &b,见下图 b。这时 p1 和 point_1 都指向变量 a,p2 和 point_2 都指向变量 b。 接着执行 swap 函数的函数体,使 * point_1 和 * point_2 的值互换,也就是使 a 和 b 的值互换。互换后的情况见图 c。

函数调用结束后,形参 point_1 和 point_2 不复存在(已释放),情况如图 d,最后在 main 函数中输出的 a 和 b 的值已经是经过交换的值。

可以看到,在执行 swap 函数后,变量 a 和 b 的值改变了。

注意:请仔细分析,这个改变是怎么实现的,这个改变不是通形参值传回实参实现的。大家可以考虑下能否通过下面的函数实现 a 和 b 互换。

void swap(int x ,int y){
    int temp;
    temp = x;
    x = y;
    y = temp;
}

如果在 main 函数中调用 swap 函数:swap(a,b); 会有什么结果?

在函数调用时,a 的值传送给 x,b 的值传送给 y,执行完 swap 函数后,x 和 y 的值是互换了,但并未影响到 a 和 b 的值。

在函数结束时,变量 x 和 y 释放了,main 函数中的 a 和 b 并未互换。也就是说,这种单向的值传递,形参值的改变不能使实参的值随之改变。

为了使在函数中改变了的变量值能被主调函数 main 所用,不能采取上述的把要改变的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值依然保留了下来。

如果想通过函数调用得到 n 个要改变的值,可以这样做:

  1. 在主调函数中设 n 个变量,用 n 个指针变量指向它们;
  2. 设计一个函数,有 n 个指针形参,在这个函数中改变 n 个形参的值;
  3. 在主调函数中调用这个函数,在调用时将这 n 个指针变量作实参,将他们的地址传给该函数的形参;
  4. 在执行该函数的过程中,通过形参指针变量,改变它们所指向的 n 个变量的值;
  5. 主调函数中就可以使用这些改变了值的变量了。

大家是不是转的有点晕,相信小编,你把刚才的程序再写两遍,下面的这个程序练习再来好好写一遍并独立思考你绝对掌握了。输入 3 个整数 a,b,c 要求按从大到小的顺序将他们输出,用函数实现。

在函数中改变 3 个变量的值。用 swap 函数交换两个变量的值,用 exchange 函数改变着 3 个变量的值。

编写源程序 10-4.c:

#include<stdio.h>
int main(){
    void exchange(int * q1,int * q2,int * q3);
    int a,b,c,*p1,*p2,*p3;

    printf("please enter 3 integer number:");
    scanf("%d%d%d",&a,&b,&c);
    p1 = &a;
    p2 = &b;
    p3 = &c;
    exchange(p1,p2,p3);

    printf("the order is :%d,%d,%d\n",a,b,c);

    return 0;
}

void exchange(int *q1,int *q2,int *q3){
    void swap(int *p1,int *p2);
    if(* q1<* q2) swap(q1,q2);
    if(* q1<* q3) swap(q1,q3);
    if(* q2<* q3) swap(q2,q3);
}

void swap(int *p1,int *p2){
    int temp;

    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

 怎么样,你学废了么?

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值