| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 438 人关注过本帖
标题:求教,关于指针的小程序,有些不明白
只看楼主 加入收藏
水上木舟
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-11-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
求教,关于指针的小程序,有些不明白
#include<stdio.h>
int main()
{
    int a[5]={2,3,8,9,4};
    int *pi[5]={&a[0], &a[1], &a[2], &a[3], &a[4] };
    int **ppi,i;
    //用指针ppi原序输出数组a中的数字
    ppi=pi;
    for(i=0;i<5;i++)
    {
        printf("%d\t",**ppi);
        ppi++;
    }
    printf("\n");
    //用指针ppi按从小到大输出输出数组a中的数字
    ppi=pi;
    ppi[1]=pi[1];
    ppi[2]=pi[4];
    ppi[3]=pi[2];//此时为何pi[2]的值等于ppi[2]的值,而不等于&a[2]?
    ppi[4]=pi[3];//此时为何pi[3]的值等于ppi[3]的值,而不等于&a[3]?
    ppi=pi;
    for(i=0;i<5;i++)
    {
        printf("%d\t",**ppi);
        ppi++;
    }
    return 0;
}
搜索更多相关主题的帖子: include 
2013-11-14 16:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:8 
ppi=pi;
ppi[1]=pi[1];
ppi[2]=pi[4];
ppi[3]=pi[2];
ppi[4]=pi[3];
就等同于
pi[1]=pi[1];
pi[2]=pi[4];
pi[3]=pi[2];
pi[4]=pi[3];

然后
pi[2]=pi[4];
pi[3]=pi[2];
就等同于
pi[2]=pi[4]
pi[3]=pi[4]
2013-11-14 16:16
wyw19880809
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:178
专家分:738
注 册:2013-3-14
收藏
得分:0 
楼上正解!!!
2013-11-14 16:43
水上木舟
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-11-14
收藏
得分:0 
回复 2楼 rjsp
我看出这种规律了,但为什么就“等同于”呢?ppi和pi之间是什么关系?
为什么ppi的值变了,pi对应的值也要变?
2013-11-14 17:19
大脸菜鸟
Rank: 2
等 级:论坛游民
帖 子:12
专家分:36
注 册:2013-10-16
收藏
得分:12 
菜鸟帮你吧。我自己前两天做过这种东西,输出验证 之类的
#include<stdio.h>
int main()
{
    int a[5]={2,3,8,9,4};                  
    int *pi[5]={&a[0], &a[1], &a[2], &a[3], &a[4] }; /*////*pi[5]是个数组,它包括5个指针变量,*pi[0]~*pi[4]。现在是分别让这5个指针变量指向数组a的5个成                      员,  指针变量pi[i]存的是a[i]的地址                  
    int **ppi,i;                 
   
    ppi=pi;      ///////指向指针的指针变量**ppi,现在ppi内存的是数组pi的首地址。那么*ppi是pi[0]的内容,就是a[0]的地址,*(*ppi)=**ppi就是a[0]的内容了
    for(i=0;i<5;i++)
    {
        printf("%d\t",**ppi);
        ppi++;               ///////ppi的 内容 自加相应类型数据占位个数,即所指地址移动一个
    }
    printf("\n");
    //用指针ppi按从小到大输出输出数组a中的数字
    ppi=pi;
    ppi[1]=pi[1];  //////这种形式没写过,不过做过类似的。ppi[1]相当于*(ppi+1),(ppi+1)就是ppi的内容增加1个单位---是Pi[1]地址值,*(ppi+1)就是改内存单元的内容,就是pi[1]内容,这里pi[1]指向没变。
    ppi[2]=pi[4];              ///////这里修改了pi【2】的指向,让pi【2】指向了a[4]
    ppi[3]=pi[2];             /////////这里修改的是pi【3】的指向=pi【2】,pi[3]也指向a[4]
    ppi[4]=pi[3];             //////pi【4】指向a【4】
        /////所以你的输出只是  2 3 4 4 4   
    ppi=pi;    //////这个多余。ppi一直指向pi数组的首地址。
    for(i=0;i<5;i++)
    {
        printf("%d\t",**ppi);
        ppi++;            /////////这里才是在修改ppi的指向。使ppi指向pi数组的下一个成员
    }
    return 0;
}

//////// 我感觉你最不明白的是ppi【i】中它是  *(ppi+i),   ()的优先级高于*,先算(),是ppi的内容+ i个该类型的占位,  *(地址值),是修改这个地址里存的数据
2013-11-14 19:56
水上木舟
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-11-14
收藏
得分:0 
回复 5楼 大脸菜鸟
有点意思,,明白了,灰常感谢。。。
2013-11-15 10:00
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
二级指针...

三十年河东,三十年河西,莫欺少年穷!
2013-11-16 12:56
U201010009
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:73
专家分:178
注 册:2013-2-25
收藏
得分:0 
回复 5楼 大脸菜鸟
受益颇多,感谢指点
2013-11-16 14:02
快速回复:求教,关于指针的小程序,有些不明白
数据加载中...
 
   



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

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