| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1468 人关注过本帖
标题:[求助]一个关于指向多维数组的指针和指针变量的问题
只看楼主 加入收藏
mayi2007
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-19
收藏
得分:0 
答案是对的..确实是4
这是整形数组指针....
2007-08-22 03:56
zzcko
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-8-13
收藏
得分:0 

#include <stdio.h>

void main()
{
int a[2][2]={{1,2},{3,4}};
int (*p)[2];
int i,j;
p=a;
i=1;
j=1;

printf("%d\n%d\n%d\n%d\n",*p,*p+1,*p+2,*p+3);

printf("%d\n%d\n%d\n%d\n\n",*p,*p+1,*(p+1),*(p+1)+1);

printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
getch();
}

在这里就要说到多维数组的内存地址分配了,
例如a[2][2],它在内存中分配的是一片连续空
间,假如首地址a即a[0][0]的地址为56,
那a[0][1]即为58,a[1][0]为60,
a[1][1]为62,所以在程序中

printf("%d\n%d\n%d\n%d\n",*p,*p+1,*p+2,*p+3);

显示出的就是数组各元素的地址值.大家也看到了
下面这句也可以得到同样的结果

printf("%d\n%d\n%d\n%d\n\n",*p,*p+1,*(p+1),*(p+1)+1);

所以这一句才是按数组下标访问多维数组的正确方式.
为什么呢?
因为int (*p)[2];定义的是一个指针数组,即此数组的任一
元素值也是一个指针,楼主程序中
printf("a[%d,%d]=%d\n",i,j,*((*p+i)+j));
这句中的(*p+i)因为*优先级高过+的优先级,所以是先取*p
的值,再进行加1.那*p的值是多少?是56,它+1即后移
一元素是多少?是58,*((*p+i)+j)中,58再后移一个是
60,对应的数组第三个元素,即3.故楼主程序结果是3.
*(p+1)是先把地址移动到数组的第二维上即a[1][0],再取出
其值,在这个值上+1即*(p+1)+1,这才移动到楼主想要的位置.

讲得有点晕,不知大家有看的明白不.呵呵..

2007-08-22 07:54
zzcko
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-8-13
收藏
得分:0 
大家可以再加上下面这句

printf("%d\n%d\n\n ",p,p+1);

就可以知道p是数组的首地址p+1是数组第二维的首地址.
因为p==*p,p+1==*p+2
2007-08-22 08:04
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:0 
p==*p,p+1==*p+2
*p是数组的始的首地址呀
你用 p==*p,我就有些晕了,换个字母表示吧

惟有学习不断的学习!
2007-08-22 08:16
华南种子
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-8-1
收藏
得分:0 
多谢啦,基本明白啦
2007-08-22 15:25
baby69yy2000
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2007-4-5
收藏
得分:0 
《c程序设计》浩强老人家 ,243页有讲这个的

2007-08-22 18:28
wszxj2008
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-6-5
收藏
得分:0 
2007-08-23 14:26
nwpu063417
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:428
专家分:28
注 册:2007-5-11
收藏
得分:0 
以下是引用华南种子在2007-8-21 22:14:30的发言:
main()
int a[2][2]={1,2},{3,4};
int(*p)[2],i,j;
p=a;
i=1;
j=1;
printf("a[%d,%d]=%d\n",i,j,*((*p+i)+j));
}
输出为a[1,1]=4
红色的代码行清楚,不是说(*(p+i)+j)表示的就是数组第i行第j列元素的值吗,怎么还用个*((*p+i)+j)来表示,不懂???

这段代码是LZ抄上去的吧。
首先,main()函数就少了一个{,二维数组也不应该这样初始化。
至于红色部分,我认为题意应该是printf("a[%d,%d]=%d\n",i,j, *(*(p+i)+j)); 因为这道题的本意是输出a[1][1]的值。
p是一个行指针,它指向的是二维数组行的地址。(p+i)第二行地址。*(p+i) == a[i], 而*(p+i)+j == &a[i][j]。在访问内容,就是a[i][j]。

至于楼主的写法,结果应该是a[1][0]的值,原因LS有人说了,二维数组每一行是连续的。


2007-08-23 15:55
快速回复:[求助]一个关于指向多维数组的指针和指针变量的问题
数据加载中...
 
   



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

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