C++ 最初只是 C 的前端,因此无法回避原始语言的大量包袱。比如<cXXX>标头中的很多东西,以及很多操作的行为,比如数组衰减(a)。
如果你想要更方便的数组类型,C++在std::vector 中有这样的野兽。如果您传递它,您将不会受到使用更底层内存分配方法时可能看到的衰减的影响。参见,例如:
#include <iostream>
#include <vector>
void someFunction (const std::vector<int> &myVec) {
std::cout << myVec.size() << std::endl;
}
int main() {
std::vector<int> myVec({ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 0 });
std::cout << myVec.size() << ' ';
someFunction(myVec);
}
输出13 13,表明函数内部和外部的大小相同(它也是elements中的大小,而不是给定bt sizeof的字节,前者通常是更有用的措施)。
在指导或培训 C++ 程序员时,我总是警告他们要成为一名“C+”程序员,他们是在 C 环境中长大的,但从未真正完全过渡到 C++(比如继续使用原始数组而不是向量,滚动当标准库中有完全足够的数据结构时,您就拥有了数据结构,使用malloc/free 或printf,等等)。
您会明智地认为 C 和 C++ 是相关但完全不同的语言,并尽可能采用 C++ 的思维方式。
(a) 有趣的是,您的具体问题 not 是否有一个数组衰减为指针。 new 调用实际上直接返回一个指针,因此不涉及衰减。
你会看到衰变的地方是:
void someFunction (int x[]) {
// Pointer to first element here, size is int-pointer-size.
std::cout << sizeof(x) << std::endl;
}
:
// Array here, size is 13 * int-size.
int xyzzy[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 0 };
std::cout << sizeof(xyzzy) << std::endl;
someFunction(xyzzy);