我还在学习C++。目前我正在学习数组,并希望获得数组的长度。我知道要获得数组的长度,我必须键入:
int length = (sizeof(array)/sizeof(*array));它工作得很好。但是,当我创建一个我命名为getLength()的方法来获取长度时,它不起作用。下面是我的代码:
#include <iostream>
using namespace std;
int array[5] = {1,2,3,4,5};
int getLength(int arg[]){
return(sizeof(arg)/sizeof(*arg));
}
int main(){
//array length
cout << "Displaying array length" << endl;
cout << getLength(array) << endl;
system("pause");
}它应该返回5,但它返回1。如果我使用前面的方法,它会返回5,即使它们有相同的代码。
谢谢你的帮助。
发布于 2015-12-31 20:04:54
这是因为当传递给getLength时,array已经衰减为指针类型。
因此,在该函数中,sizeof不能用于检索数组的总大小;它仅计算出指向第一个元素的指针的大小。
在这种情况下,通常的做法是将size值作为参数传递给getLength。
发布于 2015-12-31 20:05:06
因为当您将数组传递给函数时,数组会衰减为指针。因此,sizeof(arg)将返回架构上指针的大小。如果你需要这个大小,你需要向函数传递一个额外的参数。查看:What is array decaying?
发布于 2015-12-31 20:40:56
当您使用数组调用函数时,数组会衰减到指向第一个元素的指针。数组语法很容易让人误解。下面两个函数是等价的:
void func1(int* p) { /* do something */ }
void func2(int p[]) { /* do something */ }详情请参见this stack overflow answer。
你能做的就是深入研究模板。下面是一个可以工作的函数:
template <typename T, size_t N>
size_t array_length(T (&arr)[N])
{
return N;
}模板通过引用捕获数组(arr),大小(N)通过模板匹配已知。您的main()示例可以与之配合使用。
话虽如此,但我认为使用std::vector<>或std::array<>要好得多。有了这些,大小是微不足道的,你可以获得其他令人愉快的属性,尤其是它们不会衰减为指针。
https://stackoverflow.com/questions/34546262
复制相似问题