C++中的sizeof关键字
声明
sizeof
是一个关键字,而非函数- 以下均为32位的计算结果
- 为了便于数据可视化,将数组类型定义为了
char
在一维数组中
char arr[] = "abcde"; cout << sizeof(arr) << endl; // 6 整个数组的大小,加上末尾终止符 '\0' cout << sizeof(arr + 0) << endl; // 4 即 arr[0] 的地址 ,偏移量为 0,等价于 &arr[0] cout << sizeof(*&arr) << endl; // 6 先引用再解引用,等价于 sizeof(arr) cout << sizeof(&*arr) << endl; // 4 先解引用为 arr[0], 再取 arr[0] 的地址 cout << sizeof(*arr) << endl; // 1 arr[0] 这个元素的大小 等价于 sizeof(arr[0]) cout << sizeof(*(arr + 1)) << endl; // 1 arr[1] 这个元素的大小 cout << sizeof(*arr + 1) << endl; // 4 arr[0] + 1 这个整型数字(自动类型提升为 int) 故大小为 4 解引用之后是一个元素,与二维的要区分开来 cout << sizeof(&arr) << endl; // 4 整个数组的地址而非数组首元素的地址 // cout << sizeof(&(arr + 1)) << endl; // 错误写法:因为 arr + 1 就是 a[1] 的地址,无法再取地址 cout << sizeof(&arr + 1) << endl; // 4 表示跳过一整个数组大小之后指向的地址,虽然可能并没有申请使用这块地址 // 但是可以计算出其大小
特别注意。当数组作为参数进行传递时,此时的
sizeof(数组名)
是一个指针的字节数,而非数组中所有元素的字节数之和,即
- 对于单个变量的指针 p 而言,
sizeof(p)
就是指针的字节数- 对于数组空间的指针 p 而言,
sizeof(p)
就是指针指向的整个空间的字节数示例程序如下
int myFunc(int arr[]) { return sizeof(arr); } int main() { int a[10] {}; cout << sizeof(a) << "\n"; // 输出 40 (10 * 4,即 10 个 int 类型变量的的字节数之和) cout << myFunc(a) << "\n"; // 输出 8 (一个指针的字节数取决于操作系统与编译器) }
在二维数组中
char a[3][6] = {'0'}; cout << sizeof(a) << endl; // 18 整个二维数组的大小 cout << sizeof(*a) << endl; // 6 此时 a <=> &a[0] 解引用之后即为第 0 行的数组大小 cout << sizeof(a + 1) << endl; // 4 即 &a[1] cout << sizeof(*a + 1) << endl; 4 解引用完了之后还是一个地址,偏移 1 后还是一个地址 cout << sizeof(*(a + 1)) << endl; // 6 此时 *(a + 1) <=> *&a[1] <=> a[1] 解引用之后即为第 1 行的数组大小 cout << sizeof(a[0]) << endl; // 6 即为第 1 行的数组大小 cout << sizeof(a[0] + 1) << endl; // 4 此时 a[0] + 1 <=> &a[0][1] 是一个指针值 cout << sizeof(*(a[0] + 1)) << endl; // 1 此时 *(a[0] + 1) <=> *(&a[0][1]) <=> a[0][1] cout << sizeof(&a[0] + 1) << endl; // 4 此时 &a[0]+1 <=> &a[1] cout << sizeof(*(&a[0] + 1)) << endl; // 6 此时 *(&a[0]+1)) <=> *&a[1] <=> a[1] cout << sizeof(a[0][0]) << endl; // 1 元素类型大小 cout << sizeof(a[3]) << endl; // 6 越界了,但是 sizeof 不参与运算,故还是一个指针值的大小
参考
https://blog.csdn.net/WL0616/article/details/124757117
日志
1.0 修改于 2023.2.8 1.0修改于2023.2.8 1.0修改于2023.2.8
2.0 修改于 2023.2.8 2.0修改于2023.2.8 2.0修改于2023.2.8
- 增加了二维数组中
先解引用
再+1
的情形- 修改了小错误
3.0 修改于 2024.1.5 3.0修改于2024.1.5 3.0修改于2024.1.5
- 更新排版
- 修改标题
4.0 修改于 2024.1.16 4.0修改于2024.1.16 4.0修改于2024.1.16
- 增加注意点
5.0 修改于 2024.2.8 5.0修改于2024.2.8 5.0修改于2024.2.8
- 增加指针与指针所指空间的情况区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本