之间有什么区别
char *array[10];
和
char (*array)[10];
?
根据我的理解,
array
被声明为大小为10的字符数组数组。[]
的优先级高于*
。array
被声明为指向大小为10的字符数组的指针。()
和[]
具有相同的优先级,并且从左到右进行评估。然后评估*
运算符。我的理解是否正确?即使它是正确的,我也会感到非常困惑。有人可以更清楚地解释一下这个区别吗?
答案 0 :(得分:7)
当试图解释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
是一个包含指向int参数并返回指向char”指针的函数的10个指针的数组。
答案 1 :(得分:3)
第一个可能更好地称为字符指针数组。
通过识别一种技巧,可以更轻松地读取复杂的指针定义。我读了this article,这对我有所帮助。 another one也很好看。
答案 2 :(得分:1)
在第一种情况下,array
是一个包含10个指向char的指针的数组,如果它不是void some_function(char* array[10])
中的函数参数。如果它是一个函数参数,那么它是一个指向char的指针。
在第二种情况下,您的声明无效。请参阅编译错误here。
在第二种情况下,array
是一个指向10个字符数组的指针。
答案 3 :(得分:1)
char * array [10]; 是一个包含10个char指针的数组。
示例:
char *array[10] = {"Hello", "Hai"};
其中 char(* array)[10]; 是指向10个字符数组的指针。
第二个可以指向 char arr [10];
例如
array =& arr;
答案 4 :(得分:0)
检查Deep C Secrets中的“解密C声明”部分或K& R中的“复杂声明”......