char * []和char(*)[]之间的区别

时间:2013-04-01 05:21:15

标签: c arrays pointers char

之间有什么区别

char *array[10];

char (*array)[10];

根据我的理解,

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

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

5 个答案:

答案 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;

C pointer to array/array of pointers disambiguation

答案 4 :(得分:0)

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