我很困惑为什么new int
和new int[n]
都返回int*
,为什么后者不返回int**
?
以下是一些背景:参考古德里奇、Tamassia和Mount的第2版《C++中的数据结构和算法》教科书中的一个片段中的变量data
:
class Vect {
public:
Vect(int n);
~Vect();
// ... other public members omitted
private:
int* data;
int size;
};
Vect::Vect(int n) {
size = n;
data = new int[n];
}
Vect::~Vect() {
delete [] data;
}
2条答案
按热度按时间xesrikrc1#
(答案包含简化,以便于解释)
在C语言中,如果我没记错的话,指向int数组的指针应该是
int**
类型。你弄错了,在C语言中,它也是
int*
,更准确地说:int (*)[]
当您声明:
int foo[] = { 1, 2, 3 }
,数组的名称(foo
)在很多情况下可以有效地**被当作指向其第一个元素(1
)的指针。指向int
的指针是int*
。另外,为什么要调用
delete[]
而不是delete
来删除int*
(数据)?delete
删除单个对象。delete []
删除动态数组。lc8prwob2#
new int[n]
无法返回int**
类型的结果,因为int**
值必须指向int*
类型的 * object *(指针对象)。new int[n]
为n
对象数组分配内存,每个对象的类型为int
。它不创建指针对象。它返回的
int*
值指向分配数组的初始(第0个)元素。数组的其他元素可以通过指针算法访问。它 * 可以 * 被定义为产生
int (*)[n]
类型的结果,这是一个指向n
int
元素数组的指针,除了(a)C不允许数组具有非常数边界,(b)即使对于int (*)[4]
这样的东西,int*
也不太方便。C和它的祖先语言C一样,把数组当作二等公民。数组表达式在大多数情况下(但不是所有情况下)被"转换"(在编译时调整)为指针表达式,指向数组对象的初始元素,并且数组元素使用指针算法访问。(索引操作符
a[i]
是*(a+i)
的语法糖)。是的,这一切都可能令人困惑和违反直觉。
推荐阅读:comp.lang.c FAQ的第6节(大部分内容同时适用于C和C++)。