void main()
{
int (*d)[10];
d[0] = 7;
d[1]=10;
printf("%d\n",*d);
}
它应该打印10
但编译器显示如下错误:
test.c:4:7:错误:从类型'int'分配类型'int [10]'时出现不兼容的类型
请注意,我添加了一些错误,而不是全部。
答案 0 :(得分:6)
如chris所述,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;
}
答案 1 :(得分:1)
在C中,[]与*,指针语法相同。因此以下几行是相同的:
int** array2d1;
int* array2d2[];
int array2d3[][];
为了与更近的例子相关,主要功能具有以下流行形式:
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个索引”。我希望这有道理吗?
答案 2 :(得分:1)
d
是一个指向10个整数数组的指针。
int (*d)[10]
是指向10个整数数组的点的声明。
VS
int *d[10]
,这是一个包含10个int指针的数组。
对于更复杂的语法(通常涉及指针),我使用cdecl来帮助我解码它。
答案 3 :(得分:0)
它以这种形式使用 int d [10]
我猜你错了,d必须是一种“指针”,而且你在d之前放了*。 但那不是你想要的。你想命名一个整数数组,上面的符号可以看出来。
答案 4 :(得分: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;
}
希望这能帮到你!