【C++】当sizeof遇到数组、数组名和指针
一个比较易错的小问题,反正我自己是解释的含含糊糊。废话不多说,上问题:
#include<iostream>
using namespace std;
int main()
{
int x;
int* p = x;
cout << sizeof(x) << endl;
cout << sizeof(*x) << endl;
cout << sizeof(p) << endl;
cout << sizeof(*p) << endl;
return 0;
}
能判断四个sizeof得值并解释清楚各自的含义吗?{:10_256:}
首先要确定四个运算对象的具体含义:
x是数组名,sizeof(x)的结果是整个数组所占空间的大小,相当于对数组中所有元素依次sizeof的总合,
整型数组,10个元素,所以这一语句的结果为40。
*x这里是对x的解引用。(x是数组名,是指向数组首元素的指针)对x解引用,得到的就是指针所指内容,
注意,这里的“内容”是一个数组元素(int),而非数组的全部内容。因而:sizeof(*x)就可以理解为sizeof(int),
得到的结果为整型所占字节:4。
p是指针本身的值,sizeof(p)得到的是整型指针本身值的大小:4(字节)。
*p对指针p解引用,是指针所指对象(作为数组名的整型变量x),所以求值结果同样等价于sizeof(int),为4(字节)。
故:上述代码的运算结果为:40
4
4
4
值得一提的是:C++内置数组并未提供成员函数size(),无法直接得到数组容量,
而sizeof(x) / sizeof(*x)中:
分子为数组所有元素所占的空间,分母为单个元素大小,商恰好可以所谓数组元素总数。
这也是求数组容量的一种常见方法。
值得一提的是:C++内置数组并未提供成员函数size(),无法直接得到数组容量这容量可是自己写上去的,会不知道吗 永恒的蓝色梦想 发表于 2021-2-19 21:19
这容量可是自己写上去的,会不知道吗
自己定义的当然知道,不是自己定义的呢{:10_245:}
就像string 里的方法size()一样,使用场景并不一定都是自定义字符串啊 昨非 发表于 2021-2-19 21:25
自己定义的当然知道,不是自己定义的呢
就像string 里的方法size()一样,使用场景并不一定都 ...
……C++ 模板可以直接识别长度template<typename _Ty, size_t _Size>
constexpr size_t size(const _Ty(&arr))noexcept {
return _Size;
}虽然不直接,但是比那个方便吧 永恒的蓝色梦想 发表于 2021-2-19 22:16
……C++ 模板可以直接识别长度虽然不直接,但是比那个方便吧
{:10_245:} 昨非 发表于 2021-2-19 21:25
自己定义的当然知道,不是自己定义的呢
就像string 里的方法size()一样,使用场景并不一定都 ...
* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗? YouCam 发表于 2021-2-27 18:10
* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗?
不准确,因为对sizeof而言,只要是int,结果都是一样地
*p是对p解引用,是整型变量x,和*x是不同的,只不过大小相同 昨非 发表于 2021-2-27 18:25
不准确,因为对sizeof而言,只要是int,结果都是一样地
*p是对p解引用,是整型变量x,和*x是不同的,只 ...
好深奥!我下去再琢磨琢磨
页:
[1]