和有什么区别
char *array[10];
和
char (*array)[10];
?
据我了解,
- 情况1:
array
被声明为大小为 10 的字符数组。- 这是因为
[]
优先级高于*
。
- 案例二:
array
被声明为指向大小为 10 的字符数组的指针。- 这是因为
()
和[]
具有相同的优先级,并且它们是从左到右进行评估的。然后对*
运算符进行评估。
我的理解正确吗?即使它是正确的,我也会感到非常困惑。有人可以更清楚地解释一下区别吗?
当试图解释 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 的指针”。
在第一种情况下array
,是一个包含 10 个指向 char 的指针的数组,如果它不是函数参数,如void some_function(char* array[10])
. 如果它是一个函数参数,那么它是一个指向 char 指针的指针。
在第二种情况下,您的声明无效。请参阅此处的编译错误。
在第二种情况下array
是一个指向 10 个字符的数组的指针。
字符*数组[10];是一个由 10 个字符指针组成的数组。
例子:
char *array[10] = {"Hello", "Hai"};
其中char (*array)[10]; 是一个指向 10 个字符的数组的指针。
第二个可以指向char arr[10];
例子
数组 = &arr;
检查 Deep C Secrets 中的“Unscrambling C 声明”部分或 K&R 中的“复杂声明”...