【问题标题】:Difference between (*)[] and *[] declarations [duplicate](*)[] 和 *[] 声明之间的区别 [重复]
【发布时间】:2016-04-20 08:44:03
【问题描述】:

编辑
我在这里阅读了问题和答案:C pointer to array/array of pointers disambiguation。那里的答案并没有解决我的问题的重点以及下面已经发布的一些答案。这是相似,但不是重复。这里的重点旨在解释() 如何更改声明。链接中的重点更广泛,实际上并没有围绕() 对声明的影响和影响,例如我在下面包含的声明。

方式不同的原因是什么

  1. int *a[5];

  2. int (*a)[5];

被创建?

我对@9​​87654328@ 如何更改声明的解释特别感兴趣

例如

1)

a[0] = malloc(sizeof(int)); //compiles

但是对于 2) 它没有。 (错误:数组类型 int [5] 不可分配
问题:
1)2)中的()有什么作用?
2) 为什么要在声明 1 上使用声明 2
(也就是说,为什么要使用声明2?)

【问题讨论】:

  • 查看这里cdecl.org
  • @machine_1 - 参考很接近,我还明确要求了解() 对声明的影响。
  • 与这个问题stackoverflow.com/questions/25790789/…(和其他)相比,它并不是非常独特
  • @BoPersson - 通过一级间接,该链接指向我上面提到的完全相同的链接。不过谢谢。
  • @R Sahu - 请看我上面的编辑。

标签: c arrays pointers


【解决方案1】:

它们并不相同,而是完全不同。

  1. int *a[5]; 是一个由 5 个int *s 组成的数组。

  2. int (*a)[5]; 是一个指向由 5 个ints 组成的数组的指针。

因此,在前一种情况下,a[0] 是一个指针变量,因此,您可以赋值。但在后面,a[0] 是一个数组类型,根据定义是不可赋值的。


编辑:

如果您对() 的存在引起的类型差异感兴趣,请查看operator precedence[] 的优先级高于*,因此如果没有明确的()a 的附件将首先转到[]

【讨论】:

  • 那么,对于2,a[0] 不存在,而对于1,它存在?
  • @ryyker; a[0] 在这两种情况下都存在。当您声明一个指针int i; int *p = &i; 时,p 实际上是一个指向长度为1 的数组的第一个元素的指针,并且该元素可以通过*pp[0] 访问。
  • @ryyker a[0] 无论如何存在,在这两种情况下。
  • 运算符优先级与声明无关。这两行中都没有运算符。
【解决方案2】:

int (*a)[5]; 中,()* 绑定到a 并将其声明为指向数组的指针。在int *a[5]; 中,a 绑定到运算符[],因为其优先级高于*,因此将其声明为指针数组。

因此,在第二种情况下,a 是一个指向数组的指针,a[0] 是一个数组(int [5] 类型),并且根据 C 规则,数组是不可分配的。这就是声明

a[0] = malloc(sizeof(int));  

非法。

【讨论】:

  • 这直接解决了我的问题。我明白你的解释。谢谢。
  • 为什么有人会选择使用第二种声明类型? (*a)[5];创建这个变量有什么目的?
  • 这种声明通常用作将二维数组传递给函数的函数参数。
  • 运算符优先级与声明无关。声明语法只是类似于一些 C 运算符。
  • @Lundin 你能进一步解释一下吗?
【解决方案3】:

因为1 是一个指针数组,而2 是一个指向5 个int 数组的指针。像这样检查

int (*a)[5];
int *b[5];

fprintf(stderr, "%zu\n", sizeof(a)); // Prints sizeof(void *)
fprintf(stderr, "%zu\n", sizeof(b)); // Prints 5 * sizeof(void *)

【讨论】:

    【解决方案4】:

    这个

    int *a[5];
    

    是一个由 5 个 int * 类型的指针组成的数组的声明。

    所以a[0] 是一个int * 类型的对象,你可以用C 中的`void * 类型的指针来初始化它

    a[0] = malloc(sizeof(int)); //compiles
    

    这个`

    int (*a)[5];
    

    是指向int[5] 类型对象的指针的声明。所以 a[0] 是一个由 5 个 int 类型元素组成的数组。你不能用指针给数组赋值,

    所以这个说法

    a[0] = malloc(sizeof(int));
    

    无效。

    【讨论】:

    • @SouravGhosh 这是复制粘贴的错字。:)
    猜你喜欢
    • 2014-11-21
    • 2011-05-23
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2013-05-15
    相关资源
    最近更新 更多