声明将是什么(* ptr)[30];创建?

时间:2015-03-25 13:29:49

标签: c

int (*ptr)[30];会创造什么? 一般情况下,如果变量名称(在本例中为指针)在括号中,会发生什么?

4 个答案:

答案 0 :(得分:4)

int (*ptr)[30];

这里ptr是一个指向类型为int且包含30个元素的数组的指针。

没有parantheses

int *ptr[30];

将创建一个包含30个整数指针的数组ptr

答案 1 :(得分:4)

这种问题总是可以通过查看内外表达来回答,优先考虑。

在你的情况下:

int (*ptr)[30];

可以视为

int (*ptr)[30];
-> ptr                 a variable called ptr
--> *ptr               which is a pointer
---> (*ptr)[30]        which points to an array with length of 30
----> int (*ptr)[30]   in which each element is of type int

如果parens被丢弃,故事就会变成:

int *ptr[30];
-> ptr                 a variable called ptr
--> ptr[30]            which is an array with length of 30
---> *ptr[30]          in which each element is a pointer
----> int *ptr[30]     and each individual points to an int

同样的技巧总是可以应用于任何关于变量声明的表达式。(请注意,函数声明是特殊的。但它仍然可以用这种方式进行分析。)

答案 2 :(得分:2)

正如另一个答案所解释的那样,它是一个指向30个整数数组的指针。

你如何实际使用这些声明:

int arr[30];
int (*ptr)[30] = &arr;
(*ptr)[0] = 5;
printf("%d\n", arr[0]);

所以,它是一个指向30个元素的数组的指针,而不是指向数组第一个元素的指针,尽管它们的内存地址是相同的(参见casting pointer to array into pointer)。

请注意,&arr的类型与arr的类型不同,即使在void *投放到{{1}}时,它们会评估为相同的地址。

有点深奥;你可以在大多数时候使用指针指向数组的第一个元素而不是指向数组本身的指针。

答案 3 :(得分:1)

在这种情况下,ptr是指向int的30个元素数组的指针。

[]等后缀运算符的优先级高于*等一元运算符,因此表达式*a[i]将被解析为*(a[i])a为一个指针数组)。要使用指向数组的指针,必须使用数组名称显式地对一元*运算符进行分组,例如(*a)[i]a是指向数组)。

Handy table:

  *a[N]         -- a is an N-element array of pointer
(*a)[N]         -- a is a pointer to an N-element array
   *f()         -- f is a function returning a pointer
 (*f)()         -- f is a pointer to a function.