说明sizeof和strlen之间的区别。
解析:
由以下几个例子我们说明sizeof和strlen之间的区别。
第1个例子:

sizeof(ss)结果为4,ss是指向字符串常量的字符指针。
sizeof(*ss)结果为1,*ss是第一个字符。
第2个例子:

sizeof(ss)结果为11,ss是数组,计算到“\0”位置,因此是(10+1)。
sizeof(*ss)结果为1,*ss是第一个字符。
第3个例子:

sizeof(ss)结果为100,ss表示在内存中预分配的大小,100×1。
strlen(ss)结果为10,它的内部实现是用一个循环计算字符串的长度,直到“\0”为止。
第4个例子:

sizeof(ss)结果为400,ss表示在内存中的大小,100×4。
strlen(ss)错误,strlen的参数只能是char*,且必须是以“\0”结尾的。
第5个例子:

cout<<sizeof(X)<<endl;结果为12,内存补齐。
cout<<sizeof(x)<<endl;结果为12,理由同上。
答案:
通过对sizeof与strlen的深入理解,得出两者区别如下:
(1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int类型。该类
型保证能容纳实现所建立的最大对象的字节大小。
(2)sizeof是运算符,strlen是函数。
(3)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的。
sizeof还可以用函数做参数,比如:

输出的结果是sizeof(short),即2。
(4)数组做sizeof的参数不退化,传递给strlen就退化为指针。
(5)大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。这就
是sizeof(x)可以用来定义数组维数的原因:

(6)strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型
占内存的大小。
(7)sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是
个操作符而不是个函数。
(8)当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数
组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的
尺寸。
(9)数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如
fun(char [8])、fun(char [])都等价于fun(char *)。在C++里传递数组永远都是传递指向数组首
元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做:进
入函数后用memcpy将数组复制出来,长度由另一个形参传进去。代码如下:

(10)计算结构变量的大小就必须讨论数据对齐问题。为了使CPU存取的速度最快(这
同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时
经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。
这样做可能会浪费一些内存,但在理论上CPU速度快了。当然,这样的设置会在读写一些别
的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof
得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可。或者如果要按字节存
储,而不进行数据对齐,可以在Options对话框中修改Advanced Compiler选项卡中的“Data
Alignment”为按字节对齐。
(11)sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知
存储大小数据的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void
类型等。
说明sizeof的使用场合。
答案:
(1)sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

(2)用它可以看看某种类型的对象在内存中所占的单元字节。例如:

(3)在动态分配一对象时,可以让系统知道要分配多少内存。
(4)便于一些类型的扩充。在Windows中有很多结构类型就有一个专用的字段用来存
放该类型的字节大小。
(5)由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小时用
sizeof代替常量计算。
(6)如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
说明sizeof和strlen之间的区别。的更多相关文章
- (三)论sizeof与strlen之间的区别
一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等. 它的功能是:获得保 ...
- 字符串赋值方式理解 sizeof 和strlen的一些区别
#include<stdio.h>#include<string.h> int main(){ int a,i=0; char ch[10000]; while(scanf( ...
- sizeof()和strlen()
sizeof计算的是栈中大小 P { margin-bottom: 0.21cm; direction: ltr; color: rgb(0, 0, 0); text-align: justify } ...
- C-基础:详解sizeof和strlen,以及strstr
sizeof和strlen (string.h) 先看几个例子(sizeof和strlen之间的区别): (1) 对于一个指针, char* ss ="0123456789"; ...
- sizeof()与strlen()的区别
首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点: 1.sizeof是一个关键字,而strlen确实一个函数. 2.sizeof求的是字节长度,而 ...
- sizeof 跟 strlen 的区别
1.参数 sizeof是c/c++ 中的一个操作符,其作用是返回对象或数据类型所占的内存字节数. 用法:sizeof(对象).sizeof 对象.sizeof(类型) 如果类型做参数,返回的是该类型所 ...
- sizeof和strlen的区别
一.sizeof sizeof(...)是运算符,而不是一个函数. sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...
- Sizeof与Strlen的区别与联系
转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof sizeof(...)是运算符,在头文件中typedef为uns ...
- Sizeof与Strlen的区别与联系(转)
Sizeof与Strlen的区别与联系 一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...
随机推荐
- EasyUI左边树菜单和datagrid分页
//这个页面是Home.html 1 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...
- Android判断是否为刘海屏
主要总结主流品牌小米.华为.oppo.vivo的刘海屏判断.在某些特殊页面需要适配刘海屏时,可以用以下方法判断.或者判断屏幕比例是否大于2. /** * 小米刘海屏判断. */ public stat ...
- Codeforces Round #450 (Div. 2) C. Remove Extra One【*模拟链表/一个数比前面所有数大就是个record。删掉一个数,让record的个数尽量多。】
C. Remove Extra One time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 伪造服务钓鱼工具Ghost Phisher
伪造服务钓鱼工具Ghost Phisher Ghost Phisher是一款支持有线网络和无线网络的安全审计工具.它通过伪造服务的方式,来收集网络中的有用信息.它不仅可以伪造AP,还可以伪造DNS ...
- retain和copy还有assign的区别
1. 接触过C,那么假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给 (assign)了b.此时a和b指向同一块内存,请问当a不再需 ...
- ubuntu下C/C++编程起步
1. 安装VMware虚拟机软件 2. 在VMware中安装linux系统,这里安装的是Ubuntu.(用 VMware 安装 Ubuntu 12.04详细过程图解) 3. ubuntu有自带文本编辑 ...
- css :before 和 :after
:before p:before 在每个 <p> 元素的内容之前插入内容. 2 :after p:after 在每个 <p> 元素的内容之后插入内容. 2 <!DOCTY ...
- npm使用指南
npm使用指南 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs npm介绍 npm全称为Node Package Man ...
- js 简单getByClass得封装
function getByClass(oParent,sClass){ var elems = oParent.getElementsByTagName("*"); var ar ...
- JAVA_Error initializing endpoint怎么办
1 运行CMD,输入命令netstat –ano,找到这个TCP,后缀为8080的PID(我的是2660),然后打开任务管理器,在进程选项卡中打开PID查看 2 在右侧的进程窗口找到PID是左侧的 ...