首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取数组长度的C++ - GetLength()方法

获取数组长度的C++ - GetLength()方法
EN

Stack Overflow用户
提问于 2015-12-31 20:02:19
回答 3查看 4.8K关注 0票数 2

我还在学习C++。目前我正在学习数组,并希望获得数组的长度。我知道要获得数组的长度,我必须键入:

代码语言:javascript
复制
int length = (sizeof(array)/sizeof(*array));

它工作得很好。但是,当我创建一个我命名为getLength()的方法来获取长度时,它不起作用。下面是我的代码:

代码语言:javascript
复制
#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,即使它们有相同的代码。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2015-12-31 20:04:54

这是因为当传递给getLength时,array已经衰减为指针类型。

因此,在该函数中,sizeof不能用于检索数组的总大小;它仅计算出指向第一个元素的指针的大小。

在这种情况下,通常的做法是将size值作为参数传递给getLength

票数 1
EN

Stack Overflow用户

发布于 2015-12-31 20:05:06

因为当您将数组传递给函数时,数组会衰减为指针。因此,sizeof(arg)将返回架构上指针的大小。如果你需要这个大小,你需要向函数传递一个额外的参数。查看:What is array decaying?

票数 1
EN

Stack Overflow用户

发布于 2015-12-31 20:40:56

当您使用数组调用函数时,数组会衰减到指向第一个元素的指针。数组语法很容易让人误解。下面两个函数是等价的:

代码语言:javascript
复制
void func1(int* p) { /* do something */ }
void func2(int p[]) { /* do something */ }

详情请参见this stack overflow answer

你能做的就是深入研究模板。下面是一个可以工作的函数:

代码语言:javascript
复制
template <typename T, size_t N>
size_t array_length(T (&arr)[N])
{
  return N;
}

模板通过引用捕获数组(arr),大小(N)通过模板匹配已知。您的main()示例可以与之配合使用。

话虽如此,但我认为使用std::vector<>std::array<>要好得多。有了这些,大小是微不足道的,你可以获得其他令人愉快的属性,尤其是它们不会衰减为指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34546262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档