关于 C 语言二维数组引用的问题

一维数组能用指针引用,二维数组不能用指针引用吗?比如我在main函数中这样写:inta[10];intb[5][10];int*x=a;int**y=b;编译器编译到in... 一维数组能用指针引用,二维数组不能用指针引用吗?

比如我在 main 函数中这样写:

int a[10];
int b[5][10];
int *x=a;
int **y=b;

编译器编译到 int **y=b 的时候就提示出错,说不能将二维数组类型(int [][])转化成指向指针的指针类型(int **)。

我也试了强制类型转化,就是把 int **y=b; 写成 int **y=(int **)b; 这下编译器检查不出错误了,但是运行时提示引用错误的内存。究竟问题出在哪里?

(假设两个数组都已经初始化过)
若应该写为 int *y=b; 的话,那么如何引用二维数组 b 中的元素呢?如引用 b[1][1] 也一样写 y[1][1] 吗?
展开
 我来答
_whales
2013-02-20 · TA获得超过2279个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:502万
展开全部
这样应该可以
int average(int *a,int n)
{
int aver=0,i;
for (i=0;i<n;i++)aver+=a[i];
return aver/n;
}
int getaverage(int **a,int *av,int n,int m)
{
int aver =0,i;
for (i=0;i<n;i++)aver+=(av[i]=average(a[i];m));
return aver/n;
}
int a[10];
int b[5][10];
int *x=a;
int *y[5]={b[0],b[1],b[2],b[3],b[4]};
int **z=y;
int main()
{
int i;
printf("total average of a =%d\n"=, getaverage(z,a,5,10);
for (i=0;i<5;i++)printf("single average %d=%d\n",a[i]);
return 0;
}

下面应该也行,只是数组列数固定为10了
int a[10];
int b[5][10];
int *x=a;
int (*y[10])=b;
int average(int *a,int n)
{
int aver=0,i;
for (i=0;i<n;i++)aver+=a[i];
return aver/n;
}

int getaverage(int (*a[10]),int *av,int n)

{
int aver =0,i;
for (i=0;i<n;i++)aver+=(av[i]=average(a[i],10));
return aver/n;
}
int main()
{
int i;
printf("total average of a =%d\n"=, getaverage(y,a,5,10);
printf("total average of a =%d\n"=, getaverage(z,a,5,10);
for (i=0;i<5;i++)printf("single average %d=%d\n",a[i]);
return 0;
}
强硬的用法:
int average(int *a,int n)
{
int aver=0,i;
for (i=0;i<n;i++)aver+=a[i];
return aver/n;
}

int getaverage(int *a,int *av,int n,int m)
{
int aver =0,i;
for (i=0;i<n;i++)aver+=(av[i]=average(a+i*m,m));
return aver/n;
}
int main()
{
int i;
printf("total average of a =%d\n"=, getaverage(b[0],a,5,10);
for (i=0;i<5;i++)printf("single average %d=%d\n",a[i]);
return 0;
}

由于C语言并无真正的数组类型;
C数组只是一个变量集合,并无数组尺寸信息
所以除了定义处的下面数组名可见的地方,其他地方数组名就是个指针,
不包含数组尺寸信息,所以很难使用多维数组,只能自己想办法解决!
韭花逞味
2013-02-20 · 超过14用户采纳过TA的回答
知道答主
回答量:49
采纳率:66%
帮助的人:24.7万
展开全部
二维数组在内存中跟一维数组的存储方法一样,都是连续的内存区域,所以应该用一级指针访问而不能用二级指针,int *y=(int *)b;。你用二级指针的话两次寻址访问到未知内存了,所以会报引用错误的内存。
要用y访问b[1][1]可以用指针访问运算符:*(y+(1*10)+1),其中10是b的第一维的大小。
我刚试了,用y[1][1]编译报错:subscript requires array or pointer type。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
love_zhai
2013-02-20 · TA获得超过111个赞
知道小有建树答主
回答量:157
采纳率:0%
帮助的人:101万
展开全部
应该写成 int *y = b; 的,此时y是指向数组b中的 b[0][0]元素的,因为y只是一个指针,不能用下标的方式来引用原来数组中的元素,引用b中元素就要另写一个函数来实现引用,,或用其它方法实现也行,
如:
int* (int m , int n)
{
return y+m*5+n;
}
这个函数只是一个思路
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乐陶悦茶6R
2013-02-20
知道答主
回答量:5
采纳率:0%
帮助的人:7508
展开全部
int b[5][10];是一个数值,这么定义没有问题。
而int **y=b;是有问题的,你想定义的是指针指向二位数组,试想一个指针定义的是一维数组的首地址,可以通过地址加减寻找内存地址,而**y定义的是指针的指针地址,也就是**b[0][0],没有意思,运行是索引二位地址会出错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幻想的渴望
2013-02-22 · TA获得超过259个赞
知道答主
回答量:85
采纳率:0%
帮助的人:54.3万
展开全部
int a[10][10]={0};
int *p;
p=*a;
这样就可以了;
这个时候p指向数组的首个元素;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式