| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 779 人关注过本帖
标题:高手帮忙分析一下两个程序
只看楼主 加入收藏
lichence
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2009-10-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
高手帮忙分析一下两个程序
第一个程序,书上的例题
#include<stdio.h>
main()
{
    int bx[10]={1,2,3,4},i;
    char name[4][9]={{"张三"},{"李四"},{"王五"},{"赵六"}};
    char (*p)[9];
    p=name;
    for(i=0;i<4;i++)
        printf("bx=%d,name=%s\n",bx[i],(p+i));
}
输出结果是:
bx=0,name=张三
bx=1,name=李四
bx=2,name=王五
bx=3,name=赵六

红色(p+i)这个式子应该是表示“某行一维数组的地址”,为什么放在这里居然可以打印出“所指向数组的内容”?

再对比一下我自己写的另外一个程序:
#include<stdio.h>
main()
{
    int a[5][5],i,j,k=0;
    int (*p)[5];
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=k++;
        }
    }
    p=a;
    for(i=0;i<5;i++)
    {
        printf("%d",(p+i)
);
        putchar(10);
    }
}

同样是红色部分,但打印结果是:
1244956
1244976
1244996
1245016
1245036

这应该是5行一维数组的地址。我用在VC下单步执行,看到数组a[5][5]中正确分配了0~25个数。

请高手帮小弟分析一下,鸣谢。

[ 本帖最后由 lichence 于 2009-10-12 21:08 编辑 ]
搜索更多相关主题的帖子: include 
2009-10-12 20:41
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:20 
int bx[10]={1,2,3,4},i;
    char name[4][9]={{"张三"},{"李四"},{"王五"},{"赵六"}};
    char (*p)[9];
    p=name;
那么p指向二维数组name[][]的首地址,即a[0]的地址;那么(p+i)就指向a[][]的第i行,*(p+i)+j指向a[][]的第i行第j列。
下面看看你自己的例子:
#include<stdio.h>
main()
{
    int a[5][5],i,j,k=0;//给k个初值,到时候看结果也清楚
    int (*p)[5];
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=k++;
        }
    }
    p=a;
    for(i=0;i<5;i++)
    {
        printf("%d",**(p+i));//人家的例子是字符数组,你的是整型数组,所以例子里用%s,但你要用%d的话就
        必须是对应元素,而不只是地址了。而且,你的p指向二维数组,所以要用两个**才能指到数组里对于元素。
        putchar(10);
    }
}

[ 本帖最后由 m456m654 于 2009-10-12 20:56 编辑 ]
2009-10-12 20:48
lichence
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2009-10-6
收藏
得分:0 
回复 2楼 m456m654
楼上的朋友,你说的和书上的一样,但是你先运行一下第一个程序,(p+i)应该是a[0]的地址,但在打印中打出的是一维数组a[0]的值,如果这样可以的话,为什么第二个程序不可以?
2009-10-12 20:53
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
printf("bx=%d,name=%s\n",bx[i],(p+i));
你好好看看,人家可是用的%s,对于这个还要我说嘛
2009-10-12 20:58
lichence
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2009-10-6
收藏
得分:0 
回复 4楼 m456m654
楼上的大侠,我运行了你改的那部分,出来的结果是:
0
5
10
15
20

……………………

我想输出的是
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

有办法在原程序上修改出来吗?
刚才的k=0的初值我忘打上去了&……

[ 本帖最后由 lichence 于 2009-10-12 21:05 编辑 ]
2009-10-12 21:03
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
其实你自己完全可以修改一下嘛,自己动手,丰衣足食
#include<stdio.h>
main()
{
    int a[5][5],i,j,k=0;
    int (*p)[5];
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=k++;
        }
    }
    p=a;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
          {
               printf("%4d",*(*(p+i)+j));
             if(j==4)
             printf("\n");
          }
}
2009-10-12 21:14
xiaoqing8731
Rank: 2
等 级:论坛游民
帖 子:23
专家分:32
注 册:2009-10-9
收藏
得分:0 
这和字符串的输出一样   给出串的首地址   输出   p+i  不就是一个首地址吗?printf("%s",str);相信你见过吧   第二个例子一样

[ 本帖最后由 xiaoqing8731 于 2009-10-12 21:24 编辑 ]
2009-10-12 21:18
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
回复 6楼 m456m654
你确认:
前面写的
printf("%d",**(p+i));
和你后面
printf(“%d”,*(*(p+i)+j));
是正确的?

char * p1
char (*p2)[5]

p1+1与p2+1两个指针分别移动了几个byte?




要练习算法就来http:///!!有挑战哦!!
2009-10-12 21:25
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
#include<stdio.h>
void main()
{   
   char a[4][5]={"hao","bu","ni",shuo"};
   char (*p)[5];
   int i;
   p=a;
    for(i=0;i<4;i++)
      printf("%s",(p+i)); 或者 printf("%s",*(p+i));   
}
  刚才运行了一下 发现    两个都能正确输出....??

离恨恰如春草,更行更远还生。
2009-10-12 21:36
计少
Rank: 2
等 级:论坛游民
帖 子:27
专家分:24
注 册:2009-6-23
收藏
得分:0 
p+i二维数组第i行的地址
2009-10-12 21:36
快速回复:高手帮忙分析一下两个程序
数据加载中...
 
   



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

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