typedef int array[3] 和 typedef int(array)[3] 有什么区别?

What is the difference between typedef int array[3] and typedef int(array)[3]?

我最近遇到了这种定义 int 数组类型的非正统方法:

typedef int(array)[3];

起初我以为它是一个函数指针数组,但后来我意识到 *() 不见了,所以通过查看代码我推断出类型数组是一个int[3] 改为键入。我通常会将此类型声明为:

typedef int array[3];

除非我误认为它们不是一回事,否则除了使它们看起来类似于函数指针之外,以前一种方式这样做的好处是什么?

What is the difference between typedef int array[3] and typedef int(array)[3]?

它们是一样的。


在声明指针时可以使用圆括号,* 会导致不同的类型。在这种情况下,括号可能会影响 []int 的优先级。但是,这不是你的情况。

这两个是等价的。在这种情况下,括号不会改变 []int 的优先级。

工具 cdecl 有助于确认这一点:

  • int (a)[3] 给出 "declare a as array 3 of int"
  • int a[3] 给出 "declare a as array 3 of int"

如果你运行这样的代码:

typedef int array[6];

array arr={1,2,3,4,5,6};
for(int i=0; i<6; i++)
     cout<<arr[i]<<" ";

现在你 运行 这段代码是这样的:

typedef int (array)[6];
array arr={1,2,3,4,5,6};
for(int i=0; i<6; i++)
     cout<<arr[i]<<" ";

它生成的这两种类型的代码都是相同的output.This证明两者是相同的并且括号没有作用。