【发布时间】:2020-02-19 18:11:55
【问题描述】:
在 C++ 中传递数组时,它们会作为指针传递。所以我们必须明确地传递该数组的大小。
// This will not work.
int GetSize(int* arr){
return sizeof(arr)/size(int);
}
但是如果我们不使用函数来获取它的大小并在初始化数组的同一个函数中使用“sizeof”,那么现在我们会得到正确的结果。
int main(){
int arr[5];
int size = sizeof(arr)/sizeof(int);
cout << size << endl;
}
那么我是否可以将数组视为一个带有指针、其大小和元素类型的类?
现在我想了想,如果只是像指针一样处理它,我不确定 C++ 如何知道后面代码中数组的大小。
【问题讨论】:
-
当你有一个“正确的”数组时,编译器知道它,因为它必须跟踪所有变量及其类型。当你有一个指针时,编译器无法知道指针来自哪里或指向什么,因为它可以在运行时决定。
-
建议:不要使用 C 风格的数组。请改用
std::array或std::vector。 -
了解指针和数组是不相关的不同类型很重要。感知到的联系来自数组必须非常容易地转换为指向其第一个元素的指针的能力。知道数组从哪里开始并不足以知道它在哪里结束。
-
int size = sizeof(arr)/sizeof(int);-->const auto size = std::size(arr); -
“那么我是否可以将数组视为一个带有指针的类、它的大小和其中元素的类型?”简单的回答:绝对不是!指针是指针而不是数组。指向数组的指针中没有任何内容可以保存任何附加信息。任何数组在用作函数参数时都会自动转换为指向第一个元素的指针,这很简单。如果您想将其作为模板实例类型,在类型(而不是实例)中保留大小信息,请使用 std::array。如果您想要运行时大小信息,请使用 std::vector