字体
第(3/6)页
关灯
   存书签 书架管理 返回目录
 指向 a,pointer_2 指向 b。

    接着执行 if 语句,由于 a〈b,因此执行 swap 函数。注意实参 pointer_1 和 pointer_2 是

    指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。

    因此虚实结合后形参 p1 的值为&a,p2 的值为&b。这时 p1 和 pointer_1 指向变量 a,p2 和

    pointer_2 指向变量 b。

    接着执行执行 swap 函数的函数体使*p1 和*p2 的值互换,也就是使 a 和 b 的值互换。

    谭浩强      C 语言程序设计               2001 年 5 月 1 日

    函数调用结束后,p1 和 p2 不复存在(已释放)如图。

    最后在 main 函数中输出的 a 和 b 的值是已经过jiāo换的值。

    请注意jiāo换*p1 和*p2 的值是如何实现的。请找出下列程序段的错误:

    swap(int *p1,int *p2)

    {int *temp;

    *temp=*p1;      /*此语句有问题*/

    *p1=*p2;

    *p2=temp;

    }

    请考虑下面的函数能否实现实现 a 和 b 互换。

    swap(int x,int y)

    {int temp;

    temp=x;

    x=y;

    y=temp;

    }

    如果在 main 函数中用“swap(a,b);”调用 swap 函数,会有什么结果呢?请看下图所示。

    【例 10.4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。

    swap(int *p1,int *p2)

    {int *p;

    p=p1;

    p1=p2;

    p2=p;

    }

    main()

    {

    int a,b;

    int *pointer_1,*pointer_2;

    scanf("%d,%d",&a,&b);

    pointer_1=&a;pointer_2=&b;

    谭浩强      C 语言程序设计               2001 年 5 月 1 日

    if(a
    printf("\n%d,%d\n",*pointer_1,*pointer_2);

    }

    其中的问题在于不能实现如图所示的第四步(d)。

    【例 10.5】输入 a、b、c3 个整数,按大小顺序输出。

    swap(int *pt1,int *pt2)

    {int temp;

    temp=*pt1;

    *pt1=*pt2;

    *pt2=temp;

    }

    exchange(int *q1,int *q2,int *q3)

    { if(*q1<*q2)swap(q1,q2);

    if(*q1<*q3)swap(q1,q3);

    if(
上一页 目录 下一页