【问题标题】:C subscripted value is neither array nor pointer nor vectorC下标值既不是数组也不是指针也不是向量
【发布时间】: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 很高兴知道。

标签: c arrays pointers


【解决方案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 指针 - 同样适用于 abc。您可以模拟 p[i][j] 通过对缓冲区执行棘手的指针运算,但不能取消引用 int

    这些变量必须是int **,然后才能将它们用作二维数组,使用数组下标。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多