3

和有什么区别

char *array[10];

char (*array)[10];?

据我了解,

  • 情况1:
    • array被声明为大小为 10 的字符数组。
    • 这是因为[]优先级高于*
  • 案例二:
    • array被声明为指向大小为 10 的字符数组的指针。
    • 这是因为()[]具有相同的优先级,并且它们是从左到右进行评估的。然后对*运算符进行评估。

我的理解正确吗?即使它是正确的,我也会感到非常困惑。有人可以更清楚地解释一下区别吗?

4

5 回答 5

9

当试图解释 C 的类型时,将 [...](或 [...][...]... 组)与事物的左侧切换,然后从右向左阅读。因此

char *array[10] -> char *[10]array =

"array是一个包含 10 个指向 char 的指针的数组"

char (*array)[10] -> char [10](*array)

array是指向 10 个字符的数组的指针”

所以在第一种情况下,array是 10 个连续的指针,每个指针都指向一个 char(可能是单个 char,或一系列字符,如字符串),而在第二种情况下,array是单个指针,指向一个10 个连续字符的数组。

您可以对函数类型执行类似的操作,将参数列表与左侧的事物进行切换。例如,

char* (*f[10])(int*) -> char* (int*)(*[10]f)

f是一个包含 10 个函数的指针的数组,这些函数接受一个指向 int 参数的指针并返回一个指向 char 的指针”。

于 2013-04-01T05:44:23.170 回答
3

第一个可能更好地称为字符指针数组。

通过识别一种技巧可以使阅读复杂的指针定义变得更容易。我读了这篇文章,它帮助了我很多。还有一个看起来也不错。

于 2013-04-01T05:31:15.503 回答
1

在第一种情况下array,是一个包含 10 个指向 char 的指针的数组,如果它不是函数参数,如void some_function(char* array[10]). 如果它是一个函数参数,那么它是一个指向 char 指针的指针。

在第二种情况下,您的声明无效。请参阅此处的编译错误。

在第二种情况下array是一个指向 10 个字符的数组的指针。

于 2013-04-01T05:29:49.047 回答
1

字符*数组[10];是一个由 10 个字符指针组成的数组。

例子:

char *array[10] = {"Hello", "Hai"};

其中char (*array)[10]; 是一个指向 10 个字符的数组的指针。

第二个可以指向char arr[10];

例子

数组 = &arr;

指向数组/指针数组的C指针消歧

于 2013-04-01T05:30:47.697 回答
0

检查 Deep C Secrets 中的“Unscrambling C 声明”部分或 K&R 中的“复杂声明”...

于 2013-04-01T08:39:37.417 回答