请教:二位数组、指针、指针数组以及指向数组的指针
写了如下代码,想弄清楚二位数组如何用指针、指针数组以及指向数组的指针去依次读取。
代码编译通过,运行结构符合期望,他们之间的关系似懂非懂。
/*
构造二位数组,依次引入指向数组的指针、指针数组、一级指针变量,遍历之。
*/
#include <stdio.h>
#include <stdlib.h>
#define M 3 // 数组的行数
#define N 2 // 数组的列数
int main()
{
int a[M][N],i,j;
int (*q)[N]; // 指向数组的指针 注意这里的M,N与数组的M,N的对应
int *t[M]; // 指针数组 请问,为什么是这样子的?
int *p; // 指针 就是说,int (*q)[x]中的x必须不小于N
// int *t[x]中的y必须不小于M,为什么?
for (i=0;i<M;i++)
for (j=0;j<N;j++)
scanf("%d",&a[i][j]);
for (i=0,printf("\n原数组为:\n");i<M;i++)
for (j=0,printf("\n");j<N;j++)
printf("%d ",a[i][j]);
for (i=0;i<M;i++)
for (j=0,t[i]=a[i];j<N;j++)
printf("\n指针数组:*(t[%d]+%d)=%d",i,j,*(t[i]+j));
for (i=0,q=a;i<M;i++)
for (j=0;j<N;j++)
printf("\n指向数组的指针:*((*q+%d)+%d)=%d",i,j,*(*(q+i)+j));
for (i=0,p=a[0];i<M*N;i++)
printf("\n指针:p+%d= %d",i,*(p+i));
system("PAUSE");
}
问题点数:10、回复次数:7Top
1 楼cinhwa(笑*_*笑)回复于 2006-03-15 01:03:03 得分 0
问题见右文:
int (*q)[N]; // 指向数组的指针 注意这里的M,N与数组的M,N的对应
int *t[M]; // 指针数组 请问,为什么是这样子的?
int *p; // 指针 就是说,int (*q)[x]中的x必须不小于N
// int *t[x]中的y必须不小于M,为什么?
Top
2 楼citywanderer2005(流浪狗)回复于 2006-03-15 09:25:19 得分 10
1、“就是说,int (*q)[x]中的x必须不小于N”
这就话有错,应该是x必须等于N,如果q = a的话,q++就相当于地址移动sizeof(int)*N。Top
3 楼citywanderer2005(流浪狗)回复于 2006-03-15 09:29:43 得分 0
2、 int *t[x]
表示t是一个含有x个指向int类型的指针元素的数组,其中每一个指针元素都指向一个int a[N]的数组,当然x==M拉
------
哈哈,不知道说的清楚不Top
4 楼ytfrdfiw()回复于 2006-03-15 10:01:25 得分 0
说得好Top
5 楼wumingchenchao(一缕阳光)回复于 2006-03-15 10:18:20 得分 0
int *t[M]; // 指针数组 请问,为什么是这样子的?
[]的优先级别比*的高,所以t先与[M]结合,形成t[M]形式,这显然是数组形式,再与前面的*结合,*表示该数组是指针型的。Top
6 楼cinhwa(笑*_*笑)回复于 2006-03-15 13:29:20 得分 0
明白,多谢多谢!!Top
7 楼cinhwa(笑*_*笑)回复于 2006-03-15 19:11:08 得分 0
明白,多谢多谢!!Top




