**和* []是一样的吗?

时间:2014-09-25 23:22:44

标签: c++ arrays pointers

我的Eclipse IDE上有这对声明/定义(分别是.h和.hpp):

 A( T* [] );

 A<T>::A(T ** p_proc) { ... }

第一个是指针数组,另一个是指针指针。 我很困惑,因为它们在这里是可以互换的;如果我将**替换为* [],Eclipse会抱怨语法错误。但是,当我做相反的事情时,Eclipse不会引发错误。

我的问题是双重的;这两个符号基本上是一样的吗? T [][]T **也一样吗? 为什么当hpp文件的类型为* []时,Eclipse会抛出语法错误,而不是在标题中?

3 个答案:

答案 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[]) {}

它是perfectly fine

检查有关数组衰减到指针的问题,以便更详细地了解它。