有人可以解释一下声明数组和指针混合的规则吗?
以下是我发现的内容。但是,我不明白为什么int *p[10]
表示an allocation of 10 consecutive memory blocks (each can store data of type int *)
,而int (*p)[10]
表示declaring a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
。这些代码背后的规则是什么?
int p[10]; //10 consecutive memory blocks (each can store data of type int) are allocated and named as p
int *p[10]; //10 consecutive memory blocks (each can store data of type int *) are allocated and named as p
int (*p)[10]; //p is a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
目前,我对规则的猜测是:
xxx[10]
将被解释为please allocating 10 memory blocks in which each blocks may store xxx
。因此,int *p[10]
会产生10 memory blocks in which each can store data of type int *
;
(*p)
, ()
将首先被解释,这将导致指针指向某处。因此,int (*p)[10]
会产生a pointer to an array of 10 consecutive memory blocks (each can store data of type int)
。
抱歉我的英语不好。希望你能明白我的意思。 任何帮助表示赞赏!非常感谢你!
答案 0 :(得分:2)
int* p[10];
^------ belongs to int
int (*p)[10];
^---- belongs to p, ie p is pointer to int[10]
如果您不确定,可以随时查看http://cdecl.org/
PS: 实际上,在语法上,写(1)而不是(2):
是有意义的int *a; // (1)
int* a; // (2)
因为声明两个指针必须写:
int *a,*b; // and not int *a,b; !!
然而,语义上*
是类型的一部分,即。 (1)和(2)都声明(int*)
名为a
,更明确地表达为(2)。因此,多个指针的声明通常放在单独的行上:
int* a;
int* b;
答案 1 :(得分:2)
C使用中缀表示法表示类型。 10个整数的数组的类型为int [10]
,但是从数组类型派生的任何内容都在int
和[10]
之间进行推导。 (不像其他语言那样结束)。
如果我们声明具有此类型的变量,则不是int [10] arr;
,而是int arr [10];
同样,指向10个int的数组的指针不是int [10] *
,而是int (*) [10]
。
()
所需的原因是因为int * [10]
是10 int *
的数组。 ()
具有分解int
和*
的效果,因此无法将其解析为int *
类型。他们没有意思是什么"除此之外。