int *a[3]
和 和有什么不一样int (*a)[3]
?
6 回答
int a[3]
和之间没有区别int (a)[3]
,它们都声明a
为 3 的数组int
。int *a[3]
和之间有区别int (*a)[3]
,前者声明了一个包含 3 个指针的数组,int
而第二个声明了一个指向 3 个数组的指针int
。括号在这里有所不同,因为在 C 括号中的优先级高于 *。
或者,您可以使用cdecl
,它以英语输出变量声明的含义。
cdecl> explain int*a[3]
将 a 声明为指向 int 的指针的数组 3
cdecl> explain int (*a) [3]
将 a 声明为指向 int 数组 3 的指针
如果您有任何疑问,使用这个 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]]
所以,他们绝对不一样!你所拥有的是:
- 一个由 3 个指向 int 的指针组成的数组。
- 指向 3 个整数数组的指针。
您的星号似乎在格式中丢失了...
int *a[3]
声明一个数组 3 int*
。
int (*a)[3]
将 a 声明为指向整数向量的指针。这实际上与任何其他指针没有太大区别,它只是指向一个更复杂的类型。
int foo[3];
int bar[3];
int (*vp)[3];
vp = &foo;
(*vp)[0] = 0;
在这个 URL上可以找到一篇关于阅读 C 类型声明的优秀文章。作者 Eli Bendersky 提供了一种阅读声明的简单方法。你从变量的名称开始,然后沿着你走的时候所遇到的发音的线移动。基本方法是从变量名开始往右走。我将提供一个简单的概述,但我强烈建议您阅读这篇文章。
- 从变量名开始,向右走。
- 如果您点击右括号
)
或分号;
,则转回您开始向右移动的位置,然后向左移动。 - 如果你在向右的时候遇到了一个左括号
(
,那么你遇到了一个函数声明,接下来是它的逗号分隔的参数列表。注意:您将在参数列表的末尾遇到一个右括号。上述规则不适用于此右括号。 - 如果遇到左括号,请将其读作“数组”。
- 向左后,当您击中左括号时
(
,然后返回您上次向右的右括号。跳过正确的括号,然后继续重复。 - [重复]
因此,在将此规则应用于您的特定问题时...
在声明中,“ int * a[3];
”a
是变量名。所以,它是这样读的:
a
[
是一个包含3 个元素 ( )的数组 ( ),其中包含指向整数 ([3]
) 的指针 ( )*
int
而在声明中,“ int (* a)[3];
”a
是变量名。所以,它是这样读的:
a
是一个指针 (*
),指向[
由 3[3]
个整数 ( ) 组成的数组 (int
)
int *a[3]
: a 是一个由 3 个指向整数类型的指针组成的数组
int (*a)[3]
: a 是一个指向 3 个整数类型数组的指针