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

Cri*_*sti 2 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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于这条线*(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。

Jon*_*ler 5

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

p[i*n+j] = a[i*n+j] + b[i*n+j];
Run Code Online (Sandbox Code Playgroud)

的类型pint *; 因此 的类型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];
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,在设置中非常小心,您可以使用:

int *matrixsum(int **a, int **b, int m, int n)
{
    ...
    p[i][j] = a[i][j] + b[i][j];
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,对于后一个示例,您不能简单地编写:

int a[4][4] = { ... };
int b[4][4] = { ... };
int r = matrixsum(a, b, 4, 4);
Run Code Online (Sandbox Code Playgroud)

2D 数组的内存分配与int **表示法所需的内存分配完全不同。