2
void main()
{
    int (*d)[10];
    d[0] = 7;
    d[1]=10;
    printf("%d\n",*d);
}

它应该打印10,但编译器显示错误,如下所示:

test.c:4:7:错误:从类型“int”分配给类型“int[10]”时类型不兼容</p>

请注意,我包含了一些错误,而不是全部。

4

5 回答 5

6

正如克里斯所指出的,d是一个指向数组的指针。这意味着您在访问它时不正确地使用了该变量,而且除非您分配d指向有效数组,否则您将访问随机内存。

改变你的程序如下:

int main(void)
{
    int (*d)[10];  /* A pointer to an array */
    int a[10];     /* The actual array */

    d = &a;  /* Make `d` point to `a` */

    /* Use the pointer dereference operator (unary prefix `*`)
       to access the actual array `d` points to */
    (*d)[0] = 7;
    (*d)[1] = 10;

    /* Double dereference is okay to access the first element of the
       arrat `d` points to */
    printf("%d\n", **d);

    return 0;
}
于 2012-10-05T05:11:36.193 回答
1

在 C 中,[] 与 * 相同,是指针语法。因此以下几行是相同的:

int** array2d1;
int* array2d2[];
int array2d3[][];

再举一个更接近的例子,main 函数有以下流行的形式:

int main(int argc, char** argv){ ... }

或者

int main(int argc, char* argv[]){ ... }

因此

int (*d)[10]

是相同的

int* d[10]

这与

int** d;
int firstArray[10];
d = &firstArray;

实际上,您正在创建一个指向指针的指针(它是指向数组的指针)并将第一个指针分配给包含 10 个元素的数组。因此,当您运行以下行时:

d[0] = 7;
d[1] = 10;

您将第一个数组的地址分配给 7,将第二个数组的地址分配给 10。所以正如 Joachim 所提到的,要分配值,您需要尊重两次:

(*d)[0] = 7
(*d)[1] = 10

上面写着“在 d 指向的值处将 7 分配给第 0 个索引”。我希望这是有道理的?

于 2012-10-05T05:41:43.780 回答
1

d是一个指向 10 个整数数组的指针。

int (*d)[10]是指向 10 个整数数组的点的声明。

对比

int *d[10],这是一个由 10 个 int 指针组成的数组。

对于像这样更复杂的语法(通常涉及指针),我使用cdecl来帮助我对其进行解码。

于 2012-10-05T11:39:54.563 回答
0

它以这种形式使用 int d[10]

我猜你误认为 d 必须是一种“指针”,因此你在 d 之前放了一个 *。但这不是你想要的。你想命名一个整数数组,上面可以看到它的符号。

于 2012-10-05T05:02:11.493 回答
0

在 C 中,指针的概念有时会让人感到困惑。

考虑一个数组int d[6] = {0,1,2,3,4,5}

那么,*d 等价于 d[0]。d 本身是一个指向数组的指针, *d 取消引用该指针并为我们提供值。

因此,以下代码将打印相同的值:

int main()
{
    int (d)[10];
    *d = 7;
    *(d + 1)=10;
    printf("%d\n",*d);
    printf("%d\n",d[0]);
    return 0;
}

结果:

7
7

请参阅http://codepad.org/LYY9ig1i

如果您按如下方式更改代码:

#include<malloc.h>
int main()
{
    int *d[10]; //not (*d)[10]
    d[0] = (int *)malloc(sizeof(int *) * 10);
    d[0][0] = 7;
    printf("%d\n",d[0][0]);
    return 0;
}

希望这对你有帮助!

于 2012-10-05T05:45:49.717 回答