关于数组和指针混合的声明

时间:2016-10-08 13:21:37

标签: c++ arrays pointers

有人可以解释一下声明数组和指针混合的规则吗?

以下是我发现的内容。但是,我不明白为什么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)

抱歉我的英语不好。希望你能明白我的意思。 任何帮助表示赞赏!非常感谢你!

2 个答案:

答案 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 *类型。他们没有意思是什么"除此之外。