C下标值既不是数组也不是指针也不是向量
Posted
技术标签:
【中文标题】C下标值既不是数组也不是指针也不是向量【英文标题】:C subscripted value is neither array nor pointer nor vector 【发布时间】:2012-08-07 23:29:53 【问题描述】:int * matrixsum(int *a,int *b,int n,int m)
int *p=NULL,i,j;
p=malloc(sizeof(int)*n*m);
if(p==NULL)
printf("Error!\n");
exit(1);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
*(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j);
return p;
我的问题是关于 *(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j);
行:如果我用 p[i][j]=a[i][j]+b[i][j];
替换它,我会收到以下错误 3 次:
错误:下标值既不是数组也不是指针也不是向量
为什么?据我所知,它们是一回事。
我的编译器是 gcc 版本 4.6.3。
【问题讨论】:
你必须说p[i * n +j]
等等。你只有一个一维数组。
无关:您的索引算法错误,*(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j);
应使用m
而不是n
。
数组和指针绝对不是一回事。阅读comp.lang.c FAQ 的第 6 节。
请注意,错误消息中的“向量”可能指的是gcc extension,而不是C++向量。
@KeithThompson 很高兴知道。
【参考方案1】:
它们根本不是一回事——这就是编译器抱怨的原因!你可以写:
p[i*n+j] = a[i*n+j] + b[i*n+j];
p
的类型是int *
;因此p[i]
的类型是int
,你不能下标int
。您必须传递int
的二维数组或指向int
的指针数组,才能使用p[i][j]
表示法。例如,在 C99 中(使用可变长度数组 — 并注意参数的重新排序):
int *matrixsum(int n, int m, int a[m][n], int b[m][n])
...
p[i][j] = a[i][j] + b[i][j];
...
或者,在设置过程中非常小心,您可以使用:
int *matrixsum(int **a, int **b, int m, int n)
...
p[i][j] = a[i][j] + b[i][j];
...
请注意,对于后一个示例,您不能简单地写:
int a[4][4] = ... ;
int b[4][4] = ... ;
int r = matrixsum(a, b, 4, 4);
2D 数组的内存分配与 int **
表示法所需的内存分配完全不同。
【讨论】:
【参考方案2】:据我所知,它们是一回事
是的,您已正确地将线性索引转换为下标,但所有 3 个变量的类型都错误,无法应用这些下标。它们必须是 int **
类型,您才能进行二维数组索引。
【讨论】:
实际的二维数组(数组的数组)不是int**
。【参考方案3】:
编译器只是告诉您不能取消引用整数。 p
只是一个 int
指针 - 同样适用于 a
、b
和 c
。您可以模拟 p[i][j]
通过对缓冲区执行棘手的指针运算,但不能取消引用 int
。
这些变量必须是int **
,然后才能将它们用作二维数组,使用数组下标。
【讨论】:
【参考方案4】:在第二种形式中,编译器如何猜测 n 是您的选项卡(不是他的)的第一个维度的长度?计算 &t[i][j] == *(t + i * n + j)
【讨论】:
以上是关于C下标值既不是数组也不是指针也不是向量的主要内容,如果未能解决你的问题,请参考以下文章