指针-函数参数易错点分析

例:输入a和b两个整数,按照先大后小的顺序输出a和b。

 

#include <stdio.h>
int main(){
    void swap(int *p1,int *p2);
    int a,b;
    int * pointer_1,* pointer_2;
    printf("please enter a and b:");
    scanf("%d,%d",&a,&b);
    pointer_1 = &a;
    pointer_2 = &b;
    if(a<b) swap(pointer_1,pointer_2);
    printf("max=%d,min=%d\n",a,b);
    return 0;
}

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



上述例子中,我们定义两个指针变量和基本变量。首先给基本变量赋值,并将基本变量的地址赋值给指针变量


然后用指针变量作为函数参数,调用swap方法。


在swap方法中,因为*p1,*p2就是指代具体的a,b两个变量,所以我们定义的一个中间变量就不能用指针类型。


如果我们中间变量定义为 int * temp ,这时会出错,因为,*p1是a变量的值,不是地址。所以将一个值赋给变量是不正确的。


因此,我们交换*p1和*p2的值,也就是交换了a和b的值。


当然,最后我们打印出来的最大值是a,最小值是b了。




下面是一个程序正确,但是逻辑上错误的代码


#include <stdio.h>
int main(){
    void swap(int *p1,int *p2);
    int a,b;
    int * pointer_1,* pointer_2;
    printf("please enter a and b:");
    scanf("%d,%d",&a,&b);
    pointer_1 = &a;
    pointer_2 = &b;
    if(a<b) swap(pointer_1,pointer_2);
    printf("max=%d,min=%d\n",a,b);
    return 0;
}

void swap(int *p1,int *p2){
     int *p;
     p = p1;
     p1 = p2;
     p2 = p;
}
 

 

上面程序和先前程序的区别在于。我们在swap函数中,定义了一个作中间变量的指针。

z

然后,将指针变量p1赋值给找你关键变量,即将p1指针所指向的地址赋值给了p,

接着,将指针变量所保存的地址赋值给p1,所有指针p的地址赋值给p2。


完成了,对指针p1,p2 地址的 交换,但是 变量a和b两个值并没有交换。


 

 

最后,给除一个稍微复杂点的例子。


输入三个整数a,b,c,需求按照从大到小的顺序将它们输出。用函数实现,用指针实现

 

#include <stdio.h>
int main(){
    void exchange(int *q1, int *q2, int *q3);
    int a,b,c,*p1,*p2,*p3;
    printf("please enter three numbers:");
    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 *pt1, int *pt2);
      if(*q1 < *q2) swap(q1,q2);
      if(*q1 < *q3) swap(q1,q3);
      if(*q2 < *q3) swap(q2,q3);
}

void swap(int *pt1, int *pt2){
      int temp;
      if(*pt1 < *pt2){
          temp = *pt1;
          *pt1  = *pt2;
          *pt2  =  temp;
      }
}
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值