关于 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] 吗? 展开
比如我在 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] 吗? 展开
8个回答
展开全部
这样应该可以
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数组只是一个变量集合,并无数组尺寸信息
所以除了定义处的下面数组名可见的地方,其他地方数组名就是个指针,
不包含数组尺寸信息,所以很难使用多维数组,只能自己想办法解决!
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数组只是一个变量集合,并无数组尺寸信息
所以除了定义处的下面数组名可见的地方,其他地方数组名就是个指针,
不包含数组尺寸信息,所以很难使用多维数组,只能自己想办法解决!
展开全部
二维数组在内存中跟一维数组的存储方法一样,都是连续的内存区域,所以应该用一级指针访问而不能用二级指针,int *y=(int *)b;。你用二级指针的话两次寻址访问到未知内存了,所以会报引用错误的内存。
要用y访问b[1][1]可以用指针访问运算符:*(y+(1*10)+1),其中10是b的第一维的大小。
我刚试了,用y[1][1]编译报错:subscript requires array or pointer type。
要用y访问b[1][1]可以用指针访问运算符:*(y+(1*10)+1),其中10是b的第一维的大小。
我刚试了,用y[1][1]编译报错:subscript requires array or pointer type。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该写成 int *y = b; 的,此时y是指向数组b中的 b[0][0]元素的,因为y只是一个指针,不能用下标的方式来引用原来数组中的元素,引用b中元素就要另写一个函数来实现引用,,或用其它方法实现也行,
如:
int* (int m , int n)
{
return y+m*5+n;
}
这个函数只是一个思路
如:
int* (int m , int n)
{
return y+m*5+n;
}
这个函数只是一个思路
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int b[5][10];是一个数值,这么定义没有问题。
而int **y=b;是有问题的,你想定义的是指针指向二位数组,试想一个指针定义的是一维数组的首地址,可以通过地址加减寻找内存地址,而**y定义的是指针的指针地址,也就是**b[0][0],没有意思,运行是索引二位地址会出错。
而int **y=b;是有问题的,你想定义的是指针指向二位数组,试想一个指针定义的是一维数组的首地址,可以通过地址加减寻找内存地址,而**y定义的是指针的指针地址,也就是**b[0][0],没有意思,运行是索引二位地址会出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a[10][10]={0};
int *p;
p=*a;
这样就可以了;
这个时候p指向数组的首个元素;
int *p;
p=*a;
这样就可以了;
这个时候p指向数组的首个元素;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询