| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1486 人关注过本帖, 1 人收藏
标题:简单的指针变量指向问题
只看楼主 加入收藏
troyzyc
Rank: 1
等 级:新手上路
帖 子:108
专家分:0
注 册:2016-7-4
结帖率:56.6%
收藏(1)
已结贴  问题点数:6 回复次数:3 
简单的指针变量指向问题
#include <stdio.h>
int main()
{void swap(int *p1,int *p2);
int *po1,*po2,a,b;
printf("please enter a,b:\n");
scanf("%d,%d",&a,&b);
po1=&a;
po2=&b;
if(a<b)
swap(po1,po2);
printf("%d,%d\n",a,b);      如果a=1,b=2,这句中我知道无论函数swap怎么搞,a,b的赋值是不变的。
printf("%d,%d\n",*po1,*po2);可是这句中的两个指针变量里的地址已经换了呀,po1放的是b地址,po2放的是a地址了,为什么输出的还是“1,2”这样的答案?不应该是“2,1”了吗?
return 0;
}
void swap(int *p1,int *p2)
{int *p;
p=p1;
p1=p2;
p2=p;
}
搜索更多相关主题的帖子: include please return 
2016-12-22 11:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
因为这样是交换了两个指针的地址,但形参的地址并没有发生变化~只是交换了形参的值罢了~,传回实参时a,b是把a,b的地址传回来的----a,b地址本质上并没有变化--而不是把交换后p1,p2的值传回来~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-22 11:57
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
补充一下,看看这个程序,没有写什么解释,但细看应该能够看得明白~不仅数值可以通过函数双向传递,指针也可以通过函数双向传递
嗯嗯,感觉这个可以作为期末考考题的一个难点了~

程序代码:
#include <stdio.h>
int  main()
{
    void swap(int **p1,int **p2);
    void swap_2(int **p1,int **p2);
    int *po1,*po2,a,b;

    printf("please enter a,b:\n");
    scanf("%d%d",&a,&b);

    po1=&a;
    po2=&b;

    if(a<b)
    swap(&po1,&po2);

    printf("%d,%d\n",a,b);  //当a=1,b=2时,输出a=1,b=2;
    
    printf("%d,%d\n",*po1,*po2);//交换了指针, 此时po1==&b,po2==&a,输出*po1=2,*po2=1;

    swap_2(&po1,&po2);

    printf("%d,%d\n",a,b);  //输出a=2,b=1;
    
    printf("%d,%d\n",*po1,*po2);//输出*po1=1,*po2=2;//此时没有交换指针,po1==&b,po2==&a

    return 0;
}
void swap(int **p1,int **p2)
{
    int *p;
    p=*p1;
    *p1=*p2;
    *p2=p;
}
void swap_2(int **p1,int **p2)
{
    int t;
    t=**p1;
    **p1=**p2;
    **p2=t;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-22 12:23
groveer
Rank: 3Rank: 3
来 自:世界的一角
等 级:论坛游侠
威 望:1
帖 子:77
专家分:182
注 册:2013-11-18
收藏
得分:3 
建议楼主搞清楚函数传参的值传参和指针传参,c++还会有引用传参,楼主的swap函数传的是po1,po2指针的副本,也就是说,函数里的这两个指针的值是po1,po2的复制值,函数交换结果不会影响到函数外面的值,所以你的值不会交换,像楼上用二维指针传参就没问题了,当然,如果只是为了交换a和b的值还可以直接使用一维指针取a和b的地址进行交换,当然这跟楼上的第二种方法没太大区别
程序代码:
#include <stdio.h>
int main()
{void swap(int *p1,int *p2);
int *po1,*po2,a,b;
printf("please enter a,b:\n");
scanf("%d,%d",&a,&b);
po1=&a;
po2=&b;
if(a<b)
swap(&a,&b);
printf("%d,%d\n",a,b);
printf("%d,%d\n",*po1,*po2);
return 0;
}
void swap(int *p1,int *p2)
{int p;
p=*p1;
*p1=*p2;
*p2=p;
}


[此贴子已经被作者于2016-12-22 12:55编辑过]

收到的鲜花
  • 天丛云2016-12-24 16:03 送鲜花  5朵  

付出不亚于任何人的努力~
2016-12-22 12:54
快速回复:简单的指针变量指向问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015857 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved