C下标值既不是数组也不是指针,也不是向量

时间:2012-08-07 23:29:54

标签: c arrays pointers

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。

4 个答案:

答案 0 :(得分:4)

它们根本不是一回事 - 这就是编译器抱怨的原因!你可以写:

p[i*n+j] = a[i*n+j] + b[i*n+j];

p的类型为int *;因此p[i]的类型为int,您不能下标int。您必须传递int的2D数组或指向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 **表示法所需的内存分配完全不同。

答案 1 :(得分:1)

编译器只是告诉您不能取消引用整数。 p只是int指针 - 类似于abc。您可以通过在缓冲区中执行棘手的指针算法来模拟 p[i][j],但您无法取消引用int

这些变量必须是int **才能使用数组下标将它们用作2D数组。

答案 2 :(得分:1)

  据我所知,他们是同一件事

是的,您已正确地从线性索引转换为下标,但这三个变量的类型都不正确,无法应用这些下标。它们必须是int **类型才能进行二维数组索引。

答案 3 :(得分:1)

在第二种形式中,编译器如何猜测n是你的标签的第一个维度(而不是他的标签)的长度?计算&amp; t [i] [j] == *(t + i * n + j)