想用sizeof计算数组大小,但是他只会返回2,不知道为什么会这样,而且他会警告我,第一个警告改成*a就行了,但是为什么呢?
数组在作为参数的时候就退化为指针,对一个地址来取大小呢,如果是32位系统的话即为4,如果是64位系统的话为8,所以呢,在函数中sizeof获取的是指针的长度而不是数组的长度。其次,在函数中sizeof的处理时间的在编译期,也就是说对于动态生成的数组大小是不能用sizeof来算出来的。
解决办法: 用#define 定义一个预处理函数
#include <iostream>
#define arrsize(arr) sizeof(arr)/sizeof(arr[0])
using namespace std;
int size(int a[]) //得不到正确长度的
{
int num = sizeof(*a)/sizeof(int);
return num;
}
int main()
{
int a[] = {1,2,3};
cout << sizeof(a)/sizeof(a[0]) << endl;
cout << size(a) << endl;
cout << arrsize(a) << endl;
return 0;
}
数组传参时会退化为指针,不过用引用传参就行
#include<iostream>
using namespace std;
template<typename T>
size_t SizeOfArray(const T& arr)// requires is_array_v<T>
{
return sizeof(arr)/sizeof(arr[0]);
}
int main()
{
int a[100];
cout << SizeOfArray(a);
return 0;
}