【问题标题】:Difference between char *[] and char (*)[]char *[] 和 char (*)[] 的区别
【发布时间】:2013-03-22 04:59:00
【问题描述】:

有什么区别

char *array[10];

char (*array)[10];?

据我了解,

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

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

【问题讨论】:

  • 现在的问题。第一个不是字符数组的数组。它只是一个指向字符的数组。对于第二个,() and [] 确实具有与运算符相同的优先级,但这里不止于此。这些是声明性陈述。括号用于将array[] 分开,同时将其与* 结合。听起来您的理解非常接近。
  • @WhozCraig,感谢您的解释 :)

标签: c arrays pointers char


【解决方案1】:

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

在第二种情况下,您的声明无效。查看编译错误here

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

【讨论】:

  • 第二种情况是错字!我现在编辑了帖子。对不起!另外,在第一种情况下,当您说array 是一个由 10 个指针组成的数组时,我不确定我是否理解。这是否意味着*[] 之前被评估?
  • 如果你在表达式中使用了*array[0]array[0] 将首先计算(如*(array + 0)),然后计算*,从而得到*(*(array + 0))
  • 我知道。我只是对这些声明感到很困惑。不过感谢您的帮助!
【解决方案2】:

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

示例:

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

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

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

示例

数组 = &arr;

C pointer to array/array of pointers disambiguation

【讨论】:

  • an char array of 10 bytes -- 那是什么?
  • 你不觉得bytes是多余的吗?你已经有char了。
【解决方案3】:

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

通过识别一种技巧可以使阅读复杂的指针定义变得更容易。我读了this article,这对我有很大帮助。 another one 看起来也不错。

【讨论】:

  • 很棒的链接!谢谢!会检查他们。
  • 当然,没问题。一旦你学会了这个模式,阅读复杂的声明就变得非常简单了。
【解决方案4】:

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

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

"array 是一个由 10 个指向 char 的指针组成的数组"

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

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

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

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

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

f 是一个由 10 个指向函数的指针组成的数组,该函数接受一个指向 int 参数的指针并返回一个指向 char 的指针”。

【讨论】:

  • 哇哦。这绝对可以消除混乱的迷雾!这种解释是否适用于所有 C 声明?
  • @AnishRam 不,在int a[3][5] 中,您不会将[3][5] 分开,而是将它们作为一个整体保持在一起。
  • @AnishRam 差不多(我添加了一个编辑来处理 Alexey 的问题)。您可以将其扩展到函数声明...将带括号的参数列表向左移动,就像移动数组指示符一样。
  • @JimBalter,非常感谢!
  • @JimBalter 你也可以有一组(),如果一个函数返回一个指向函数的指针,该函数返回一个函数的指针......
【解决方案5】:

查看 Deep C Secrets 中的“Unscrambling C declarations”部分或 K&R 中的“Complicated declarations”...

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2017-04-02
    • 2014-10-28
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多