昨非 发表于 2021-2-19 19:52:17

【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)中:
分子为数组所有元素所占的空间,分母为单个元素大小,商恰好可以所谓数组元素总数。
这也是求数组容量的一种常见方法。



永恒的蓝色梦想 发表于 2021-2-19 21:19:41

值得一提的是:C++内置数组并未提供成员函数size(),无法直接得到数组容量这容量可是自己写上去的,会不知道吗

昨非 发表于 2021-2-19 21:25:18

永恒的蓝色梦想 发表于 2021-2-19 21:19
这容量可是自己写上去的,会不知道吗

自己定义的当然知道,不是自己定义的呢{:10_245:}
就像string 里的方法size()一样,使用场景并不一定都是自定义字符串啊

永恒的蓝色梦想 发表于 2021-2-19 22:16:27

昨非 发表于 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:19:40

永恒的蓝色梦想 发表于 2021-2-19 22:16
……C++ 模板可以直接识别长度虽然不直接,但是比那个方便吧

{:10_245:}

YouCam 发表于 2021-2-27 18:10:04

昨非 发表于 2021-2-19 21:25
自己定义的当然知道,不是自己定义的呢
就像string 里的方法size()一样,使用场景并不一定都 ...

* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗?

昨非 发表于 2021-2-27 18:25:17

YouCam 发表于 2021-2-27 18:10
* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗?

不准确,因为对sizeof而言,只要是int,结果都是一样地
*p是对p解引用,是整型变量x,和*x是不同的,只不过大小相同

YouCam 发表于 2021-2-27 19:03:46

昨非 发表于 2021-2-27 18:25
不准确,因为对sizeof而言,只要是int,结果都是一样地
*p是对p解引用,是整型变量x,和*x是不同的,只 ...

好深奥!我下去再琢磨琢磨
页: [1]
查看完整版本: 【C++】当sizeof遇到数组、数组名和指针