void main()
{
int (*d)[10];
d[0] = 7;
d[1]=10;
printf("%d\n",*d);
}
它应该打印10
,但编译器显示错误,如下所示:
test.c:4:7:错误:从类型“int”分配给类型“int[10]”时类型不兼容</p>
请注意,我包含了一些错误,而不是全部。
正如克里斯所指出的,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;
}
在 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 个索引”。我希望这是有道理的?
d
是一个指向 10 个整数数组的指针。
int (*d)[10]
是指向 10 个整数数组的点的声明。
对比
int *d[10]
,这是一个由 10 个 int 指针组成的数组。
对于像这样更复杂的语法(通常涉及指针),我使用cdecl来帮助我对其进行解码。
它以这种形式使用 int d[10]
我猜你误认为 d 必须是一种“指针”,因此你在 d 之前放了一个 *。但这不是你想要的。你想命名一个整数数组,上面可以看到它的符号。
在 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;
}
希望这对你有帮助!