3

int *a[3]和 和有什么不一样int (*a)[3]

4

6 回答 6

20

int a[3]和之间没有区别int (a)[3],它们都声明a为 3 的数组intint *a[3]和之间有区别int (*a)[3],前者声明了一个包含 3 个指针的数组,int而第二个声明了一个指向 3 个数组的指针int。括号在这里有所不同,因为在 C 括号中的优先级高于 *。

于 2008-10-30T13:26:45.187 回答
9

或者,您可以使用cdecl,它以英语输出变量声明的含义。

cdecl> explain int*a[3]

将 a 声明为指向 int 的指针的数组 3

cdecl> explain int (*a) [3]

将 a 声明为指向 int 数组 3 的指针

于 2008-10-30T16:39:22.693 回答
7

如果您有任何疑问,使用这个 g++ 技巧通常很方便:

#include <iostream>

template < class T > void describe(T& )
{
  // With msvc, use __FUNCSIG__ instead
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main(int argc, char* argv[])
{
  int *a[3];
  describe(a);

  int (*b)[3];
  describe(b);

  return EXIT_SUCCESS;
}

用 g++ 编译并运行它,你会得到:

void describe(T&) [with T = int*[3]]
void describe(T&) [with T = int (*)[3]]

所以,他们绝对不一样!你所拥有的是:

  1. 一个由 3 个指向 int 的指针组成的数组。
  2. 指向 3 个整数数组的指针。
于 2008-10-30T13:32:23.303 回答
6

您的星号似乎在格式中丢失了...

int *a[3]

声明一个数组 3 int*

int (*a)[3]

将 a 声明为指向整数向量的指针。这实际上与任何其他指针没有太大区别,它只是指向一个更复杂的类型。

int foo[3];
int bar[3];
int (*vp)[3];
vp = &foo;
(*vp)[0] = 0;
于 2008-10-30T13:30:29.533 回答
3

在这个 URL上可以找到一篇关于阅读 C 类型声明的优秀文章。作者 Eli Bendersky 提供了一种阅读声明的简单方法。你从变量的名称开始,然后沿着你走的时候所遇到的发音的线移动。基本方法是从变量名开始往右走。我将提供一个简单的概述,但我强烈建议您阅读这篇文章。

  1. 从变量名开始,向右走。
  2. 如果您点击右括号)或分号;,则转回您开始向右移动的位置,然后向左移动。
  3. 如果你在向右的时候遇到了一个左括号(,那么你遇到了一个函数声明,接下来是它的逗号分隔的参数列表。注意:您将在参数列表的末尾遇到一个右括号。上述规则不适用于此右括号。
  4. 如果遇到左括号,请将其读作“数组”。
  5. 向左后,当您击中左括号时(,然后返回您上次向右的右括号。跳过正确的括号,然后继续重复。
  6. [重复]

因此,在将此规则应用于您的特定问题时...

在声明中,“ int * a[3];a是变量名。所以,它是这样读的:

a[是一个包含3 个元素 ( )的数组 ( ),其中包含指向整数 ( [3]) 的指针 ( )*int

而在声明中,“ int (* a)[3];a是变量名。所以,它是这样读的:

a是一个指针 ( *),指向[由 3[3]个整数 ( ) 组成的数组 ( int)

于 2009-07-17T19:08:02.263 回答
-2

int *a[3]: a 是一个由 3 个指向整数类型的指针组成的数组

int (*a)[3]: a 是一个指向 3 个整数类型数组的指针

于 2020-01-08T07:52:18.077 回答