int *a[3]
和之间有什么区别int (*a)[3]
?
int a[3]
和之间没有区别int (a)[3]
,它们都声明a
为3 int
s 的数组.int *a[3]
和之间有区别int (*a)[3]
,前者声明了一个3个指针的数组,int
而第二个声明了一个指向3 int
秒数组的指针.括号在这里有所不同,因为在C括号中的优先级高于*.
或者,您可以使用cdecl
,它以英语输出变量声明的含义.
cdecl> explain int*a[3]
声明一个指向int的指针数组3
cdecl> explain int (*a) [3]
声明一个指向int数组3的指针
如果你有任何疑问,使用这个g ++技巧通常很方便:
#includetemplate < 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数组的指针.
看起来你的星号在格式化中丢失了......
int *a[3]
声明一个3的数组int*
.
int (*a)[3]
将a声明为指向int的向量的指针.这与任何其他指针实际上并没有太大的不同,它只是指向一个更复杂的类型.
int foo[3]; int bar[3]; int (*vp)[3]; vp = &foo; (*vp)[0] = 0;