应该说sizeof测得的是数组定义形式所占字节数,比如int a[100],int占4字节,所以sizeof(a)=4×100=400,如果是double型的就是8×100=800了
在自定义函数中,形式参数的int a[]被自动转换成int a,a已经变成了指针,而指针的长度总是4,因此如果int的长度为2的话,sizeof(a)/sizeof(a[0])就是4/2,结果为2。
通过sizeof可以计算出类型的长度,同样也可以计算出数组的长度,但是这具有一定的局限性。
以下是一段示例代码:
session 1: 计算出数组的长度
session 2: 通过函数计算出数组的长度
session 3: 通过函数计算出数组的长度
1 算术表达式:
#include <iostream>int main() {
int arr[4];
std::cout << sizeof( arr ) / sizeof( arr[0] ) << std::endl; // 输出4
}
或者
#include <iostream>int main() {
int arr[4];
std::cout << sizeof( arr ) / sizeof( arr ) << std::endl; // 输出4
}
2 函数模板参数自动推断:
#include <iostream>template <typename T, size_t N>
inline size_t Count( T ( & arr )[N] ) {
return N;
}
int main() {
int arr[4];
std::cout << Count( arr ) << std::endl; // 输出4
}
3标准C++模板库:
#include <type_traits> // 注意包含此头文件#include <iostream>
int main() {
int arr[4];
std::cout << std::extent<decltype( arr ), 0>::value << std::endl; // 输出4
}
4模板特化与自动类型推断:
include <iostream>template <typename T>
class ComputeSize;
template <typename T, size_t N>
class ComputeSize<T[N]> {
public:
static const size_t value = N;
};
int main() {
int arr[4];
std::cout << ComputeSize<decltype( arr )>::value << std::endl; // 输出4
}
5 Visual C++编译器预定义宏:
#include <cstdlib>#include <iostream>
int main() {
int arr[4];
std::cout << _countof( arr ) << std::endl; // 输出4
}
6 boost库:
#include "boost/rangehpp"#include <iostream>
int main(){
int arr[4];
std::cout << boost::size( arr ) << std::endl; // 输出4
}
上面的方法适用于静态数组,动态的数组(new[])是无法获取元素个数的。
上面的代码,自己可以编译运行看看,如果手上没有编译器测试上面的代码或者编译失败,可以在下面的页面上编译运行(最新版本的Visual C++):
>
当数组当作参数传递时,它就退化成指针了,要求数组长度的话,可以在main函数内部求得,如下修改就好啦!!!
#include <iostream>
using namespace std;
int main(){
void sort(int x);
int aa[]={1,3,2,0}, len;
len = sizeof(aa)/sizeof(int);
sort(aa);
return 0;
}
void sort(int x){
cout<<x<<endl;
}
以上就是关于sizeof 所测得的字符数组的长度是不是就是字符数组定义的长度全部的内容,包括:sizeof 所测得的字符数组的长度是不是就是字符数组定义的长度、C语言如何获得数组长度(size/size遇到了问题)、用sizeof计算数组的长度有什么要注意的地方等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)