这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 3.指针变量作为函数参数

共7条 1/1 1 跳转至

3.指针变量作为函数参数

高工
2014-10-29 14:31:48     打赏

  函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。


  【例10-3】题目同【例10-2】,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。


swap(int *p1,int *p2){
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
main(){
    int a,b;
    int *pointer_1,*pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1=&a;pointer_2=&b;
    if(a<b) swap(pointer_1,pointer_2);
    printf("\n%d,%d\n",a,b);
}

 

  对程序的说明:

  1) swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。


     2) 接着执行if语句,由于a<b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。




  3) 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。函数调用结束后,p1和p2不复存在(已释放)。



  4) 最后在main函数中输出的a和b的值是已经过交换的值。请注意交换*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;
    if(a<b) swap(pointer_1,pointer_2);
    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(*q2<*q3)swap(q2,q3);
}
main(){
    int a,b,c,*p1,*p2,*p3;
    scanf("%d,%d,%d",&a,&b,&c);
    p1=&a;p2=&b; p3=&c;
    exchange(p1,p2,p3);
    printf("\n%d,%d,%d \n",a,b,c);
}

 




专家
2018-02-21 11:17:58     打赏
2楼

指针作为函数参数,很实用。


专家
2022-07-13 10:52:46     打赏
3楼

指针作为函数参数


专家
2022-07-13 10:55:17     打赏
4楼

谢谢分享


工程师
2022-07-14 21:29:59     打赏
5楼

不错的分享


专家
2022-07-14 21:41:33     打赏
6楼

谢谢分享


工程师
2022-07-15 23:57:22     打赏
7楼

学到经验了


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]