int *a[3]
和int (*a)[3]
之间有什么区别?
int a[3]
和int (a)[3]
之间没有区别,它们都声明a
为3 int
的数组。 int *a[3]
和int (*a)[3]
之间存在差异,前者声明了一个指向int
的3个指针的数组,而第二个声明了指向3个int
的数组的指针。 括号在这里有所不同,因为在C括号中的优先级高于*。
或者,您可以使用cdecl
,它以英语输出变量声明的含义。
cdecl> explain int*a[3]
声明一个指向int的指针数组3
cdecl> explain int (*a) [3]
声明一个指向int数组3的指针
如果您有任何疑问,使用这个g ++技巧通常很方便:
#include 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]]
所以,他们肯定不一样! 你有的是:
看起来你的星号在格式化中丢失了……
int *a[3]
声明一个3 int*
的数组。
int (*a)[3]
将a声明为指向int的向量的指针。 这与任何其他指针实际上没什么不同,它只是指向一个更复杂的类型。
int foo[3]; int bar[3]; int (*vp)[3]; vp = &foo; (*vp)[0] = 0;
在阅读C类型声明时,此URL上有一篇很好的文章。 作者Eli Bendersky提供了一种阅读声明的简单方法。 您从变量的名称开始,然后沿着发出您走路时遇到的内容的线移动。 基本方法是从变量名开始并向右移动。 我将提供一个简单的概述,但我强烈建议您阅读这篇文章。
因此,将此规则应用于您的特定问题……
在声明中,“ int * a[3];
”, a
是变量名。 所以,它被读取:
a
是指针(*
)到整数(int
)的3个元素([3]
)的数组([
)
在声明中,“ int (* a)[3];
”, a
是变量名。 所以,它被读取:
a
是指向整数([3]
)的3个元素([3]
)的数组([
)的指针(*
)
以上就是c/c++开发分享涉及指针和数组的两个声明之间的区别相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。
”本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。
如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545987.html