C++ 如何在函数中获取作为参数的数组的长度?

112 天前
 rabbbit

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

#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);
}
3903 次点击
所在节点    C++
36 条回复
stcheng
112 天前
+1 to geelaw's answer
chendl111
112 天前
#include <bits/stdc++.h>
using namespace std;

template <size_t n>
size_t get_array_length(int (&nums)[n])
{
return n;
}

int main() {
int nums[] = {1, 2, 3, 4, 5};
size_t length = get_array_length(nums);
std::cout << "The length of the array is: " << length << std::endl;

// 打印数组中的所有元素
for (size_t i = 0; i < length; ++i) {
std::cout << nums[i] << " ";
}
std::cout << std::endl;

return 0;
}
ysc3839
112 天前
@ripperdev 这里可以直接用 std::size 吧?用 std::distance 的话,遇到 std::list 可能会报很复杂的错误吧?
Droi
112 天前
不确定生成的数据长度可以用向量,确定的话用结构体包裹数组与数组相应的长度。
方法很多啊,能用库当然是最方便的。
kirory
112 天前
#include <span>
#include <iostream>

void f(std::span<int> arr ){
std::cout << arr.size() <<"\n";
}
int main(){
int arr[] = {1,2,3};
f(arr);
}
Leonooo13
112 天前
@rabbbit 指针指向数组,指针可以指向一个地址,一般指向数组的首地址,通过移动遍历地址。
junkun
112 天前
C++20 可以用 std::span 。
zhuangzhuang1988
112 天前
直接上 Span
我在 C#也是用 Span.
用得好, 可以少写很多代码
Feep
112 天前
编译器遇到 形参列表里的 T[] 时会进行隐式转换
参考 https://zh.cppreference.com/w/cpp/language/array
mingl0280
112 天前
手动狗头。
你可以在数组前面加个长度嘛,反正就是预留一个 size_t 的位置然后再填数组就好啦,进函数先把头部的长度解出来就行了哈哈哈哈。
araraloren
111 天前
@chendl111 There is not need to get length using `get_array_length` in same scope of `nums`. You can just using `sizeof`.
greycell
111 天前
v2 c++水平不如知乎可还行
lingxi27
111 天前
@greycell 比知乎差得可太远了
yougotme
99 天前
没必要简单问题复杂化,加一个大小参数吧,把精力用在能搞钱的地方。
geelaw
76 天前
@GeruzoniAnsasu #11 应该这样做可以改进可执行文件大小:

void foo(int *array, size_t length);

template <size_t length>
void foo(int (&array)[length])
{ foo(array, length); }

最终结果里面 foo 模板的实例应该都会内联从而完全消除。如果要支持实参传递则要实现为 functor……
xuelang
8 天前
哈哈,你可以看这篇 C++ 函数可变参实现方法的演进: https://selfboot.cn/2024/05/07/variadic_arguments_in_c++/

模板里可以拿到参数数量的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1012152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX