sizeof和strlen的一些理解
来源:互联网 发布:网络运营公司经营范围 编辑:程序博客网 时间:2024/05/16 02:11
最近又一次看到sizeof运算符和strlen函数,感觉有点忘了,就打开《C++primer》研究一下,这里做下记录,以后忘记可以随时查看,比较方便。
1 sizeof的定义
首先,sizeof运算符返回一条表达式或一个类型名字所占用的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型。size_t类型是一种机器相关的无符号类型,它设计的足够大以便能够表示内存中任意对象的大小。在cstddef头文件定义(即C标准库stddef.h头文件的C++语言版本)。
2 sizeof的作用类型
a 对char或者类型为char的表达式执行sizeof运算,结果得1。例如:
char a = '0'; std::cout<<sizeof(a); //结果是1
b 对引用类型执行sizeof运算得到被引用对象所占空间的大小。例如:
c 对指针执行sizeof运算得到指针本身所占空间的大小。例如:
d 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得的结果求和。注意。sizeof运算符不会把数组转换成指针来处理。例如:
int *a = new int[50]; int b[50]; std::cout<<sizeof(a)<<'\t'<<sizeof(b); //结果是4 200
虽然在C++语言中,指针和数组有着紧密联系,实际使用数组时编译器一般会把数组转换成指针,如上例子中变量b本身代表指向数组b[50]的第一个数的指针,但是sizeof运算符不会把数组转换成指针来处理,因此得到的结果是4*50=200,而a显式的定义为指针,因此sizeof计算的就是指针所占的字节数4。( 这里注意一下,a和b的操作都可以用a[0]和b[0]或者*(a+1)和*(b+1)来操作,但是如果使用++运算符,则*(a++)正确,但是*(b++)报错。说明b是常量指针。)
根据这样一个性质,经常使用
sizeof(b)/sizeof(*b)来计算数组的长度。
e 对string和vector对象执行sizeof运算只返回给类型固定部分的大小,不会计算对象中的元素占了多少空间。例如:
3 strlen的定义
strlen则是计算字符串中有效字符数(不包含'\0')。例如:
char *p1="Hello"; char p2[]="Hello"; //等价于p2[]={'H','e','l','l','o','\0'}; char p3[]={'H','e','l','l','o'}; std::cout<<sizeof(p1)<<'\t'<<sizeof(p2)<<'\t'<<sizeof(p3)<<std::endl; // 4 6 5 std::cout<<strlen(p1)<<'\t'<<strlen(p2)<<'\t'<<strlen(p3)<<std::endl; // 5 5 10sizeof在计算p1时因为是显式的指针,因此为4,p2因为编译器赋值会自动补'\0',因此计算为6,p3时因为直接显示赋值,因此为5。
strlen在计算p1和p2时都是当成字符数组来计算,而且不包含'\0',因此计算为5,而p3则遇到'\0'才结束计算,我们没有显示给出'\0',因此出来的值是不确定的。
- sizeof和strlen的一些理解
- sizeof和strlen的理解
- sizeof 和 strlen 的深入理解
- 对于sizeof()和strlen()的深入理解
- sizeof和strlen的一些事
- 关于sizeof和strlen的一些用法
- 深入理解sizeof 和 strlen
- 深入理解sizeof和strlen
- 深入理解sizeof和strlen
- 深入理解sizeof和strlen
- sizeof和strlen的一些用法和区别
- 关于数组的 sizeof和strlen 的一些计算
- strlen和sizeof的区别
- strlen和sizeof的区别
- strlen和sizeof的区别
- sizeof 和 strlen 的区别
- 数组的sizeof和strlen
- sizeof 和 strlen的区别
- LeetCode 141. Linked List Cycle
- c++对象模型阅读笔记
- C++开发环境
- 用Filter程序实现静态HTML页面的访问保护
- 内存泄漏就被这样解决了
- sizeof和strlen的一些理解
- 注意事项
- 从头认识多线程-1.9 迫使线程停止的方法-return法
- 《推荐系统学习》之推荐系统那点事
- #1037 : 数字三角形
- Android SO逆向-流程控制语句及表达式运算
- HTML从零开始
- DefaultHttpClient is deprecated
- 全局大喇叭 广播机制