鱼C论坛

 找回密码
 立即注册
查看: 3384|回复: 7

[技术交流] 【C++】当sizeof遇到数组、数组名和指针

[复制链接]
发表于 2021-2-19 19:52:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        一个比较易错的小问题,反正我自己是解释的含含糊糊。
        废话不多说,上问题:
#include<iostream>
using namespace std;

int main()
{
        int x[10];
        int* p = x;
        cout << sizeof(x) << endl;
        cout << sizeof(*x) << endl;
        cout << sizeof(p) << endl;
        cout << sizeof(*p) << endl;

        return 0;
}
        能判断四个sizeof得值并解释清楚各自的含义吗?

        首先要确定四个运算对象的具体含义:
        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)
中:
分子为数组所有元素所占的空间,分母为单个元素大小,商恰好可以所谓数组元素总数。
这也是求数组容量的一种常见方法。




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-19 21:19:41 | 显示全部楼层
值得一提的是:C++内置数组并未提供成员函数size(),无法直接得到数组容量
这容量可是自己写上去的,会不知道吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-19 21:25:18 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-19 21:19
这容量可是自己写上去的,会不知道吗

自己定义的当然知道,不是自己定义的呢
就像string 里的方法size()一样,使用场景并不一定都是自定义字符串啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)[_Size])noexcept {
    return _Size;
}
虽然不直接,但是比那个方便吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-27 18:10:04 | 显示全部楼层
昨非 发表于 2021-2-19 21:25
自己定义的当然知道,不是自己定义的呢
就像string 里的方法size()一样,使用场景并不一定都 ...

* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 18:25:17 | 显示全部楼层
YouCam 发表于 2021-2-27 18:10
* x 我可以理解为x数组里面任意一个int 变量吗?
* p 和 * x 一样吗?

不准确,因为对sizeof而言,只要是int,结果都是一样地
*p是对p解引用,是整型变量x,和*x是不同的,只不过大小相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好深奥!我下去再琢磨琢磨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 13:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表