除了传个长度参数进去还有别的办法吗?


```
#include <iostream>
using namespace std;

void f(int nums[])
{
        cout << sizeof(nums) << endl;
}

int main()
{
        int nums[5] = {1,2,3,4,5};
        f(nums);
        return (0);
}
```
举报· 620 次点击
登录 注册 站外分享
30 条回复  
marat1ren 小成 2024-1-28 11:01:33
用向量,别用数组
shyrock 小成 2024-1-28 11:11:04
也可以在数组尾部加入一个约定的结尾符
ripperdev 小成 2024-1-28 11:16:18
这种写法的话,在 f 函数里的 nums 数组已经退化成指针了。
如果是 C++20 标准的话,可以这么写
```cpp
#include <iostream>
using namespace std;

void f(auto &&nums)
{
        cout << std::distance(std::begin(nums), std::end(nums)) << endl;
}

int main()
{
        int nums[5] = { 1,2,3,4,5 };
        f(nums);
        return (0);
}

```
geelaw 小成 2024-1-28 11:21:18
void foo(int nums[]) 和 void foo(int *nums) 没啥区别,要同时知道长度的话,用 template <size_t n> void foo(int (&nums)[n])
leonshaw 小成 2024-1-28 11:28:32
std::span
ershierdu 小成 2024-1-28 12:43:14
从问题和给的样例来看,OP 应该是刚入门?
建议先学习一下 STL ,也就是 std::vector 之类的。楼上说的其他方案都更高阶了,可能不是现阶段你需要的
mainjzb 初学 2024-1-28 13:04:33
int nums[]  在 go 里其实是对应的 C++ 的 std::vector 。
那么 C++为什么没有这么做呢,因为出道太早。很多旧代码已经写成这样了。贸然改动会导致旧代码崩溃。所以只能引入新的名词,导致新人难以理解。
这就是大家经常抱怨 C++历史包袱太多的表现之一。
GeruzoniAnsasu 小成 2024-1-28 13:31:04
见 #8 的标准方法

然而这个方法不是用来传你理解的数组的,这个传数组引用的方法几乎都发生在 constexpr / consteval 场景中,传入普通的「静态大小」(而非「编译期计算」) array 会导致实例化出大量一次性代码,严重增加目标可执行文件的冗余



以你现在刚开始入门的阶段建议先好好啃啃 c++ primer ,以前觉得 primer 上来就是模板库太抽象了,但现代版本的 c++ 确实就是大量依赖模板打造的编译期约束上的。
manyfreebug 小成 2024-1-28 13:34:16
在 C++ 中,当数组传递给函数时,数组会退化为指针,因此在函数中使用 sizeof 来获取数组的长度是不准确的。在这种情况下,可以通过传递数组的长度作为额外的参数来解决。

如果你不想显式传递数组长度,你可以考虑使用 C++ 中的 std::array 或者 std::vector 。这两者都包含了一个成员函数 size(),可以方便地获取数组的长度。

下面是一个使用` std::array` 的例子:
```
#include <iostream>
#include <array>

void f(std::array<int, 5>& nums)
{
    std::cout << nums.size() << std::endl;
}

int main()
{
    std::array<int, 5> nums = {1, 2, 3, 4, 5};
    f(nums);
    return 0;
}
```

或者使用 `std::vector:`
```
#include <iostream>
#include <vector>

void f(std::vector<int>& nums)
{
    std::cout << nums.size() << std::endl;
}

int main()
{
    std::vector<int> nums = {1, 2, 3, 4, 5};
    f(nums);
    return 0;
}
```
这样就可以方便地获取数组的长度而不必显式传递长度参数。
1234下一页
返回顶部