sizeof本身是C语言的一个运算符,但也被C++支持,且很多C++代码中经常会出现。

sizeof可以很容易计算一个数组的长度,这在数组作为参数的函数中很有用(数组作为函数参数,传入的其实是首元素的地址,必须带上数组的实际长度作为另一个参数才行)。

请看下面代码(visual stadio 2019环境编译,unicode字符集,x64程序):


#include <iostream>
int main()
{using namespace std;int iValue = 10;cout << "int:" << sizeof(iValue) << endl;int array_int[] = { 1, 2, 3 };cout << "array_int:" << sizeof(array_int) << endl;char chChar = 'a';cout << "char:" << sizeof(chChar) << endl;char array_char[] = { 'a', '是', 'c' };cout << "array_char:" << sizeof(array_char) << endl;wchar_t wcChar = L'a';cout << "wchar:" << sizeof(wcChar) << endl;wchar_t array_wchar[] = { L'a', L'是', L'c' };cout << "array_wchar_t:" << sizeof(array_wchar) << endl;const char* pEnglish = "hello";cout << "char*_en:" << sizeof(pEnglish) << endl;const char* pChinese = "中文";cout << "char*_zh:" << sizeof(pChinese) << endl;int* pInt = new int(10);cout << "int*:" << sizeof(pInt) << endl;system("pause");return 0;
}

首先,编译时便会有一下警告:

问题出在这一句:char array_char[] = { 'a', '是', 'c' };

为何会有警告?这里涉及到另一个编码问题,此处先不说,后面有机会再写一篇文章说明。

执行结果如下:

是否有些意外?逐行解释:

sizeof(iValue)输出4很简单,一个int占4个字节,都会背了。

sizeof(array_int)输出12,说明sizeof的参数如果是数组,则会输出数组中所有元素的总字节数。3个int元素,每个int4个字节,一共12个字节,很好理解。

后面的char和array_char也证明了这一点,一个char占一个字节,array_char里有3个元素,每个占1个字节,这个数组中加起来就是3个字节。

wchar_t是宽字节,其对应的所有字符都是两个占2个字节。所以sizeof(array_wchar)就会输出3*2=6。

sizeof(pEnglish)为何会输出8呢?这是因为sizeof的参数若不是数组,只是计算其对应变量的字节数。这行代码输出的其实是pEnglish这个变量的字节数,而不是它所指向的字符串。pEnglish是什么?是个指针。在64位程序中,不管什么类型的指针,都是占8个字节;而在32位程序中,指针占4个字节。

sizeof(pChinese)中pChinese所指向是一个中文字符串,但是pChinese本身也是一个char类型的指针,所以会输出8。

sizeof(pInt),pInt也是一个指针,所以输出的还是8(这里没有delete pInt,实际程序中一定不能忘了)。

总结起来两点:

1、sizeof的参数如果是数组,则输出数组中所有元素的字节总数;

2、sizeof的参数如果不是数组,则输出参数本身所占的字节数。

根据上面所讲第一点,很容易计算出数组中元素的个数:数组中所有元素的总字节数/数组元素类型的字节数。

例如上面的array_int,则只需要:sizeof(array_int)/sizeof(int);array_wchar,则只需要sizeof(array_wchar)/sizeof(wchar_t)即可。

另外,上面说到,在32位程序中,指针变量本身占4个字节,以上程序,在vs的配置管理器中将程序改成x86的即可验证。

运行结果如下:

可以看到,后面四个指针变量的sizeof都是4。

除了这些,我们还经常听到“一个英文字符占1个字节,一个中文字符占2个字节”,又是什么意思呢?在另一篇文章中会有介绍。

C++基础(十五)sizeof的用法 计算数组长度相关推荐

  1. Python基础十五:面向对象编程四:高级特性

    Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...

  2. 函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因

    参考文章:c中自定义函数通过sizeof来输出数组的长度为何不正确?[原创] 错误原因 我们可以使用sizeof(arr) / sizeof(arr[0])求数组长度,但是要注意:sizeof()函数 ...

  3. c语言获取结构体大小sizeof,C语言sizeof求结构体数组长度

    C语言sizeof求结构体数组长度 C语言sizeof求结构体数组长度 #include typedef struct ss{ char a;//偏移量为0,大小为1,0能被1整除,=1 short ...

  4. C++ 计算数组长度

    实现程序如下 #include<iostream>using namespace std;int main() {int s[] = { 0, 2, 5, 8 };int i;cout & ...

  5. sizeof 和strlen计算字符串长度

    首先使用使用sizeof计算字符串长度: #include<stdio.h> #include<string.h> int main() { int len; char a[] ...

  6. C语言——计算数组长度

    如何计算 C 语言数组长度 数组特点 长度固定(变长数组除外) 数组每个元素占用的字节数相同即: sizeof(a[0]) = sizeof(a[1]) = sizeof(a[n]) 一维数组 数组定 ...

  7. 弱引用使用场景桌面_吃透Java基础十五:强引用、软引用、弱引用、虚引用

    本文首发CSDN博客地址:https://blog.csdn.net/u013277209?viewmode=contents 前言 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就 ...

  8. 高数基础-第五章-反常积分的计算

    例22 积分需要区分不同函数 例23 一般结论:如果被积函数存在跳跃间断点,则原函数在分界点上连续不可导.左导数等于被积函数的左极限,右导数等于被积函数的右极限. 例24 需要确定b,分母的被积函数恒 ...

  9. plsql 循环存储过程返回数据集合_Java基础(十五)——Collection集合、泛型 - 寒江雨

    Collection集合 集合概述 集合:集合是Java中提供的一种容器,可以用来存储多个数据 数组的长度是固定的,集合的长度是可变的 数组中存储的是同一种数据类型的元素,可以存储基本数据类型也可以存 ...

最新文章

  1. Java设计模式-七大设计原则
  2. python读取内存和空闲内存
  3. 整理JAVA知识点--基础篇,能力有限不足地方请大神们帮忙完善下
  4. s3c2440存储控制器和地址以及启动的理解
  5. 聊聊storm的IWaitStrategy
  6. 修正discuz发帖首次换行无效的问题
  7. WebView点击图片看大图效果
  8. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...
  9. 如何清除Edge浏览器的360导航、谷歌上123导航
  10. Hive 动态分区恢复静态分区表数据
  11. Mac上使用docker环境进行C++开发的实践
  12. Pytorch学习——池化层
  13. 区块链技术及应用概述
  14. 【xla】五.1、XlaCache命中规则
  15. Axue8.0基础使用篇
  16. Dell戴尔笔记本电脑G3 3779原装出厂Windows10系统恢复原厂oem系统
  17. CSS: Animation CSS:动画 Lynda课程中文字幕
  18. 微信充值取消出现闪屏问题引发的思考
  19. charles抓手机端的包(android手机)
  20. 七大行星排列图片_七大行星大小排列顺序

热门文章

  1. matlab ----bwboundaries---bwmorph-----bwareaopen
  2. Jquery miniUI 开发教程(2) 搭建Jquery miniUI 开发环境
  3. 【完结】毕设全记录——JavaBDD的应用(布尔表达式的运算、CTL公式解析、模型检验)
  4. linux 内核环形缓冲区,环形缓冲区
  5. 智能净水器app开发功能
  6. c++入门基础知识——常量和变量
  7. 二维数组与二级指针是好朋友吗?
  8. Text Justification -- LeetCode
  9. EF的水印和验证码图制做
  10. 读取excel从一行开始特定的列