2
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

4 回答 4

5

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

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

的类型pint *; 因此 的 类型p[i]int,并且您不能为int. 您必须传递 的 2D 数组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);

int **二维数组的内存分配与符号所需的完全不同。

于 2012-08-07T23:37:25.707 回答
1

编译器只是告诉您不能取消引用整数。p只是一个int指针 - 类似a, b, 和c. 您可以通过在缓冲区中执行棘手的指针算术来进行模拟 p[i][j],但您不能取消引用int.

这些变量必须int **在您可以将它们用作二维数组之前,使用数组下标。

于 2012-08-07T23:32:13.427 回答
1

据我所知,它们是同一回事

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

于 2012-08-07T23:34:26.167 回答
1

在第二种形式中,编译器如何猜测 n 是您的选项卡(不是他的)的第一个维度的长度?计算 &t[i][j] == *(t + i * n + j)

于 2012-08-07T23:44:18.047 回答