我的Eclipse IDE上有这对声明/定义(分别是.h和.hpp):
A( T* [] );
和
A<T>::A(T ** p_proc) { ... }
第一个是指针数组,另一个是指针指针。
我很困惑,因为它们在这里是可以互换的;如果我将**
替换为* []
,Eclipse会抱怨语法错误。但是,当我做相反的事情时,Eclipse不会引发错误。
我的问题是双重的;这两个符号基本上是一样的吗? T [][]
和T **
也一样吗?
为什么当hpp文件的类型为* []
时,Eclipse会抛出语法错误,而不是在标题中?
答案 0 :(得分:6)
我的问题是双重的;这两个符号基本上是一样的吗?
不,他们不是。 T*[]
具有指向T
指针的未知大小的数组,而T**
具有指向T
指针的类型指针。数组和指针通常不相同。
但是,将函数参数声明为数组类型与将其声明为相应的指针类型完全相同。如果一个函数参数被指定为具有数组类型,那么它&#34;&#34;调整&#34;拥有相应的指针类型。同样,int*
和int[]
不是同一类型,但是当您编写一个带有int[]
参数的函数时,它会进行调整以便它采用int*
参数。 (请注意,如果参数是引用到数组,则会禁止此调整。)
T [][]
和T **
是否相同?
实际上T[][]
根本不是有效类型。在多维数组类型中,只能忽略第一个绑定。
为什么当hpp文件的类型为
* []
但Eclipse不在标题中时,Eclipse会抛出语法错误?
可能是因为您正在撰写T*[] p_proc
。正确的声明者是T* p_proc[]
。
答案 1 :(得分:3)
它们与函数的参数相同。函数参数不能具有“T的数组”类型。如果您尝试将函数参数声明为具有“T的数组”类型,则编译器将(静默地)将其调整为“指向T的指针”。
但其他地方并非如此。例如,有类似的东西:
//filea.cpp
int x[SIZE];
和:
//fileb.cpp
extern int *x;
...将不工作。
答案 2 :(得分:1)
如果你的Eclipse不理解以下情况,那就是一个错误:
template<typename T>
struct A{
A(T **p_proc);
};
template<typename T>
A<T>::A(T *p_proc[]) {}
检查有关数组衰减到指针的问题,以便更详细地了解它。