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

  • 增加指针与指针所指空间的情况区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Dwj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值