当前位置: 代码迷 >> C语言 >> [求助]一个关于指向多维数组的指针和指针变量的问题
  详细解决方案

[求助]一个关于指向多维数组的指针和指针变量的问题

热度:46   发布时间:2007-08-22 03:56:06.0
答案是对的..确实是4
这是整形数组指针....
----------------解决方案--------------------------------------------------------

#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,这才移动到楼主想要的位置.

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


----------------解决方案--------------------------------------------------------
大家可以再加上下面这句

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

就可以知道p是数组的首地址p+1是数组第二维的首地址.
因为p==*p,p+1==*p+2
----------------解决方案--------------------------------------------------------
p==*p,p+1==*p+2
*p是数组的始的首地址呀
你用 p==*p,我就有些晕了,换个字母表示吧
----------------解决方案--------------------------------------------------------
多谢啦,基本明白啦
----------------解决方案--------------------------------------------------------
《c程序设计》浩强老人家 ,243页有讲这个的
----------------解决方案--------------------------------------------------------

----------------解决方案--------------------------------------------------------
以下是引用华南种子在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有人说了,二维数组每一行是连续的。

----------------解决方案--------------------------------------------------------

  相关解决方案