问题描述
考虑以下代码:
int main(){
int arr[] = {1,2,3,7,8};
int size = sizeof(arr);
cout << size;
}
我知道上面的代码将打印4 * 5 = 20字节的数组的大小,但是我对此有一个小疑问,arr
是指向数组中第一个元素的指针, ptr变量的大小为4个字节,那么为什么它在控制台中不输出4个字符?
即使我们取消引用arr
并打印它,也将打印数组中的第一个元素。
cout << *arr;
那么这个sizeof()
运算符在数组的情况下如何工作?
解决方法
sizeof(arr)
是arr
不会 衰减为指针类型的情况之一。
您可以使用一元加运算符强制指针衰减:
std::size_t/*a better type*/ size = sizeof(+arr);
,
arr
是指向数组中第一个元素的指针
这是一个错误的假设。 arr
不是一个指针。它是5个整数的数组。
那么为什么它在控制台中不打印出4?
因为它不是arr
的字节大小。
那么在数组情况下,这种sizeof()运算符如何工作?
您将获得类型的大小(以字节为单位)。与其他所有类型相同。
,要完成答案,您还可以使用C ++ 11的std::extent
获得元素数量在我的机器上:
#include <iostream>
#include <type_traits>
int main()
{
int arr[] = {1,2,3,7,8};
std::cout << sizeof(arr) << "\n";
std::cout << sizeof(+arr) << "\n";
std::cout << std::extent<decltype(arr)>::value << "\n";
}
打印:
20
8
5
来自@eerorika评论:
如果您使用C ++ 17,也可以使用std::size
std::cout << std::size(arr); // prints 5