涉及指针和数组的两个声明之间的区别

时间:2008-10-30 13:14:34

标签: c arrays pointers

int *a[3]int (*a)[3]之间的区别是什么?

6 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:9)

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

cdecl> explain int*a[3]

声明指向int

的指针数组3
cdecl> explain int (*a) [3]

声明指向int

的数组3的指针

答案 2 :(得分: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. 指向3个整数数组的指针。

答案 3 :(得分:6)

看起来您的星号在格式化中丢失了......

int *a[3]

声明一个3 int*的数组。

int (*a)[3]

将a声明为指向int的向量的指针。这与任何其他指针没有太大的不同,它只是指向一个更复杂的类型。

int foo[3];
int bar[3];
int (*vp)[3];
vp = &foo;
(*vp)[0] = 0;

答案 4 :(得分:3)

在阅读C类型声明时,有一篇优秀的文章被发现at this URL。作者Eli Bendersky提供了一种阅读声明的简单方法。您从变量的名称开始,然后沿着发出您走路时遇到的内容的线移动。基本方法是从变量名开始并向右移动。我将提供一个简单的概述,但我强烈建议您阅读这篇文章。

  1. 从变量名开始,然后右转。
  2. 如果你选择了正确的)或分号;,那么请回到你开始向右走的地方然后向左走。
  3. 如果你在向右走的时候遇到左侧的(,那么你遇到了一个函数声明,接下来是它的逗号分隔的参数列表。 注意:您将在参数列表的末尾遇到正确的paren。上述规则不适用于此权利。
  4. 如果您遇到左括号,请将其读作“数组”。
  5. 向左走后,当你击中左边的(时,然后回到你最后一次向右走的右边。跳过那个正确的paren,然后继续重复。
  6. [重复]
  7. 所以,将此规则应用于您的特定问题......

    在声明中,“int * a[3];”,a是变量名称。所以,它被读为:

      

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

    在声明中,“int (* a)[3];”,a是变量名称。所以,它被读为:

      

    a是指向3个元素(*)整数([)[3])的指针(int) >

答案 5 :(得分:-2)

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

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