查找参数化数组的大小

  • 本文关键字:数组 参数 查找 c++
  • 更新时间 :
  • 英文 :


我只是想获得作为函数中参数传递的数组的大小,但我不明白为什么sizeof(k(/sizeof(k[0](只返回一个,当它在声明的范围内正常工作时,我缺少什么?

这是代码:

#include <iostream>
using namespace std;
int fn(int k[]){

cout << "size in function :" << sizeof(*k) / sizeof(k[0]) << endl; //returns 1 for some reason    
//cout << "size in function :" << end(k)-begin(k) << endl; // can't find begin-end fitting function?

int m = *max(&k[0], &k[sizeof(k)/sizeof(int)]);
return m;
}
int main()
{
int k[] = { 1,2,3,4,5,6,7 };
int s = size(k);
cout << "size :" << sizeof(k) / sizeof(k[0]) << endl;
cout << "max: " << fn(k);
return 0;
}

仅数组的大小"存在";在编译时。在编译代码时,数组只不过是指针。

因此,如果您希望函数接受大小的数组,则需要在编译时传递该大小,这意味着它必须是一个模板参数。

template<std::size_t N>
int fn(int (&k)[N]){
cout << "size in function :" << N << endl;
cout << "size in function :" << end(k)-begin(k) << endl;
int m = *max(begin(k), end(k));
return m;
}

这里缺少什么?

参数的类型为int*(从未知绑定的数组中调整后(。

sizeof(k)/sizeof(int)

您将指针的大小除以整数的大小。这种划分与元素所指向的数组的大小无关

当它在声明的范围内工作良好时

这是因为k的类型不是int*。那个k的类型是int[7]

查找参数化数组的大小

在C++中,参数的类型从来都不是数组。如果您将函数参数声明为数组,那么该类型将被调整为指向该数组元素的指针。

如果参数的类型是指针,并且指针指向数组的元素,那么就没有通用的方法来找出有问题的数组的大小。

有些数组包含一个序列,该序列由具有sentinel值的元素终止。您可以通过对sentinel值执行线性搜索来确定此类序列的长度。以Null结尾的字符串是此类序列的常见示例。

老式的C风格是将数组的大小作为单独的参数传递:

int fn(int k[], std::size_t size);
// usage
int k[] = { 1,2,3,4,5,6,7 };
fn(k, std::size(k));

一种更现代的方法是在类中组合指针和大小。在标准库中有一个用于此目的的类模板:

int fn(std::span<int> k);
// usage
int k[] = { 1,2,3,4,5,6,7 };
fn(k);

最新更新