< p >"int *a[3]"和"int (*a)[3]"有什么区别?< /p >
答:第一个声明是一个数组,它包含三个指向整数的指针;第二个声明是一个指针,它指向一个包含三个整数的数组。
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的数组,其大小为3,每个元素都是指向整型变量的指针。
cdecl> explain int (*a) [3]
声明a为指向包含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]]
所以,它们绝对不是相同的!你拥有的是:
a
和 b
名称。 - Ropez看起来你的星号在格式中丢失了...
int *a[3]
声明了一个包含3个int*
的数组。
int (*a)[3]
声明a为指向整数向量的指针。这与任何其他指针并没有太大区别,只是它指向了一个稍微复杂一些的类型。
int foo[3];
int bar[3];
int (*vp)[3];
vp = &foo;
(*vp)[0] = 0;
)
或分号;
,则返回到最初向右移动的位置,然后向左移动。(
,则遇到一个函数声明,接下来是它逗号分隔的参数列表。注意:在参数列表的末尾会遇到右括号,上述规则不适用于该右括号。(
时,回到你上次向右移动时的右括号处。跨过那个右括号,然后继续重复向右移动。所以,在将此规则应用于您的特定问题时...
在声明“int * a [3];
”中,a
是变量名。因此,它的阅读方式为:
a
是指向整数(int
)的指针(*
)数组([
),有3个元素([3]
)
而在声明“ int (* a) [3];
”中,a
是变量名。因此,它的阅读方式为:
a
是指向三个元素([3]
)的整数(int
)数组([
)的指针(*
)。
int *a[3]
:a是指向3个整数类型指针的数组
int (*a)[3]
:a是指向3个整数类型数组的指针