| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 339 人关注过本帖
标题:这个指针的问题不太理解?帮我解释一下?
只看楼主 加入收藏
zpcg
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-8-21
结帖率:100%
收藏
 问题点数:0 回复次数:3 
这个指针的问题不太理解?帮我解释一下?
问题我放在程序的注释中了
程序代码:
/*利用调用函数交换三个数*/

#include <stdio.h>
void main()
{
    void exchange(int *q1, int *q2, int *q3);
    int a , b, c;                      //输入 12   65   31 三个数
    int *p1, *p2, *p3;
    scanf("%d%d%d", &a, &b, &c);
    p1 = &a; p2 = &b; p3 = &c;        
    printf("原来:%d %d %d\n", p1, p2, p3);//输出原来p1 p2 p3 的地址
    printf("&值%d %d %d\n", &a, &b, &c);
    printf("变量a b c值%d %d %d\n", a, b, c);
   
    exchange(p1, p2, p3);
   
    printf("\n交换后:%d %d %d\n", p1, p2, p3); //输出交换后p1 p2 p3 的地址,交换后的指针地址应该不一样啊,可结果和原来一样不理解! ,怎么回事?
    printf("&值%d %d %d\n", &a, &b, &c);      
    printf("变量a b c值%d %d %d\n", a, b, c);    //交换的是指针指向的地址,这三个数顺序应该不变才对,可结果也交换了,不理解!怎么回事?
}

void exchange(int *q1, int *q2, int *q3)
{
    void swap(int *qt1, int *qt2);
    if(*q1 < *q2) 
        swap(q1, q2);
    if(*q1 < *q3)  
        swap(q1, q3);
    if(*q2 < *q3)  
        swap(q2, q3);
}

void swap(int *qt1, int *qt2)
{
    int t;
    t = *qt1;
    *qt1 = *qt2;
    *qt2 = t;
}



[ 本帖最后由 zpcg 于 2011-8-26 22:33 编辑 ]
2011-08-26 22:31
hoy0a1d
Rank: 2
等 级:论坛游民
帖 子:19
专家分:83
注 册:2010-8-1
收藏
得分:0 
指针 地址其实一直都没变  只是修改了  指针指向的变量的值

p1 = &a; p2 = &b; p3 = &c;

只有这里  对指针地址赋值

swap 函数  只是改变了指针指向的变量的值  并非对指针重新赋于新的地址

Test.
2011-08-26 23:24
yujine
Rank: 1
等 级:新手上路
帖 子:6
专家分:3
注 册:2011-8-13
收藏
得分:0 
同意楼上说法swap 函数 只换值
2011-08-27 00:42
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
你这个结果正常。在调用函数里面改变主函数的数值,需要指向该变量的指针,因此,你要交换a,b,c的数值,需要传递&a,&b,&c。因此你的swap函数成功调换了a,b,c中的数值;但是你要改变指针的值,那么同样需要指向指针的指针,因此需要有二级指针来完成。你用了1级指针当然达不到目的了。
#include <stdio.h>
void main()
{
    void swap_pt(int **q1, int **q2);
    void swap_value(int *qt1, int *qt2);
    int a , b;
    int *p1, *p2;
    scanf("%d%d", &a, &b);
    p1 = &a; p2 = &b;
    printf("原来:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);
    printf("a=%d    b=%d\n", a, b);
  
    swap_pt(&p1, &p2);
    printf("\n\n交换指针后:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);     
    printf("a=%d    b=%d\n", a, b);

    swap_value(&a, &b);
    printf("\n\n交换数值后:\n");
    printf("p1=%p    p2=%p\n", p1, p2);
    printf("&a=%p    &b%p\n", &a, &b);     
    printf("a=%d    b=%d\n", a, b);
}
void swap_pt(int **q1, int **q2)
{
int *tmp;
tmp=*q1;
*q1=*q2;
*q2=tmp;
}
void swap_value(int *qt1, int *qt2)
{
    int t;
    t = *qt1;
    *qt1 = *qt2;
    *qt2 = t;
}

gcc编译后输出:
12 45
原来:
p1=0xbfb5fe1c    p2=0xbfb5fe18
&a=0xbfb5fe1c    &b0xbfb5fe18
a=12    b=45

交换指针后:
p1=0xbfb5fe18    p2=0xbfb5fe1c
&a=0xbfb5fe1c    &b0xbfb5fe18
a=12    b=45

交换数值后:
p1=0xbfb5fe18    p2=0xbfb5fe1c
&a=0xbfb5fe1c    &b0xbfb5fe18
a=45    b=12


[ 本帖最后由 pauljames 于 2011-8-27 06:51 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-08-27 06:22
快速回复:这个指针的问题不太理解?帮我解释一下?
数据加载中...
 
   



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

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