函数的传址调用(新思维)

函数的传址调用(交换变量 swap)


传址调用就是传地址调用,也称为传引用调用。函数的另外一种调用方式是传值调用

传值调用建立参数的一份拷贝并把它传给调用的函数,在调用函数中修改参数值的拷贝不影响原始的变量值;传引用调用允许调用函数修改原始变量的值。

如何写一个函数来交换两个整数变量呢?

例:

 void swap(int x, int y)

{
    int t;t = x;x = y;y = t;
}

显然是不行的。 swap 并不知道参数的实际地址。

例:#include <stdio.h>

void swap(int *px, int *py)
{
    int t;
    t = *px; *px = *py; *py = t;
}


int main(int argc, char *argv[])
{
    int a=5, b=3;
    swap(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}

你需要告诉 swap,参数 a 和 b 的地址才能完成真正的交换操作。

例:#include <stdio.h>

void swap(int *px, int *py)
{
    int t;
    printf("px=%p\n", px);
    printf("py=%p\n", py);
    t = *px;        /* 将地址 px 指向的值保存到 t */
    *px = *py;      /* 将地址 py 指向的值直接保存到地址 px */
    *py = t;        /* 将值 t 直接保存到地址 py */
}


int main()
{
    int a=5, b=3;
    printf("a address is %p\n", &a);
    printf("b address is %p\n", &b);
    swap(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
程序运行结果如下:


a address is 0028FF3C
b address is 0028FF38
px=0028FF3C
py=0028FF38
3    5

 注意:a 和 b 的地址由操作系统动态分配,未必和上面的结果一致。


定义函数,求两个浮点数的之和

#include <stdio.h>
double add(double x,double y)
{
    double z;
    z=x+y;
    return z;
}
 
int main()

{
    double a,b,c;
    scanf("%lf %lf",&a,&b);
    c=add(a,b);
    printf("sum is %.3lf\n",c);
    return 0;
}

如果要求变一下:定义函数,求两个浮点数的之和、差

可以分别定义两个函数来完成,可以再定义一个新的函数。但如果只能使用一个函数呢? 一个函数只能有一个返回值,如果同时提供两个返回值呢?

在C语言中,可以通过地址传递来解决。

1>传址调用返回多个参数

#include <stdio.h>
void add_sub(double x,double y, double *t1, double *t2)
{
    *t1=x+y;
    *t2=x-y;
}
 
int main()
{
    double a,b,c, d;
    scanf("%lf %lf",&a,&b);
    add_sub(a,b, &c, &d);
    printf("sum is %.3lf, sub is %.3lf\n",c, d);
    return 0;
}

2  >传址调用的另外的一个作用就是避免数组的复制(或移动)。

#include <stdio.h>


void bubble_sort(int v[ ], int n)
{
    int i, j, t;
    printf("%p-%p\n", v, v+n);
    for(i=0; i<n-1; i++)
        for (j=0; j<n-1-i; j++)
            if (v[j]>v[j+1])
            {
                t = v[j];
                v[j] = v[j+1];
                v[j+1]=t;
            }
}


int main(int argc, char *argv[])
{
    int v[6] = { 2, 3, 9, 1, 0, 7};
    int i;


    bubble_sort(v, 6);
    for (i=0; i<6; i++)
        printf("%d ", v[i]);
    printf("\n");
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值