一、sizeof

    sizeof(...)是运算符,而不是一个函数。

    一个简单的样例:

int a;

cout<<sizeof a<<endl;

    在头文件里typedef为unsigned int,其值在编译时即计算好了,參数能够是数组、指针、类型、对象、函数等。

    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小

    因为在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

    实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

    详细而言,当參数分别例如以下时,sizeof返回的值表示的含义例如以下:

    数组——编译时分配的数组空间大小;

    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);

    类型——该类型所占的空间大小;

    对象——对象的实际占用空间大小;

    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

*****************





二、strlen

    strlen(...)是函数,要在执行时才干计算。

    參数必须是字符型指针(char*), 且必须是以'\0'结尾的。当数组名作为參数传入时,实际上数组就退化成指针了。

int ac[10];

    cout<<sizeof(ac)<<endl;

    cout<<strlen(ac)<<endl;     (ac相当于一个指针,可是strlen仅仅能接受char*类型,所以编译时出错)

    它的功能是:返回字符串的长度。该字符串可能是自定义的,也可能是内存中随机的,该函数实际完毕的功能是从代表该字符串的第一个地址開始遍历,直到遇到结束符'\0'。返回的长度大小不包含'\0'。

*****************





三、举例:

    eg1、char arr[10] = "Hello";

              int len_one = strlen(arr);

              int len_two = sizeof(arr); 

              cout << len_one << " and " << len_two << endl; 

    输出结果为:5 and 10





    点评:

             sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。

             strlen仅仅关心存储的数据内容,不关心空间的大小和类型。






    eg2、char * parr = new char[10];

              int len_one = strlen(parr);

              int len_two = sizeof(parr);

              int len_three = sizeof(*parr);

              cout << len_one << " and " << len_two << " and " << len_three << endl;

    输出结果:3 and 4 and 1





    点评:

             第一个输出结果3实际上每次执行可能不一样,这取决于parr里面存了什么(从parr[0]開始直到遇到第一个'\0'结束);

             第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,可是事与愿违,sizeof觉得parr是个字符指针,因此返回的是该指针所占的空间(





指针的存储用的是长整型,所以为4第三个结果,因为*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。

*****************************************************************************************************************************************************

*****************************************************************************************************************************************************

*****************************************************************************************************************************************************

以下是程序猿面试宝典上面总结的:





1.sizeof操作符的结果类型是size_t,它在头文件里typedef为unsigned int类型。 

该类型保证能容纳实现所建立的最大对象的字节大小。 



2.sizeof是算符,strlen是函数。 



3.sizeof能够用类型做參数,strlen仅仅能用char*做參数,且必须是以''\0''结尾的。 

sizeof还能够用函数做參数,比方: 

short f(); 

printf("%d\n", sizeof(f())); 

输出的结果是sizeof(short),即2。 



4.数组做sizeof的參数不退化,传递给strlen就退化为指针了。 



5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)能够用来定义数组维数的原因 

char str[20]="0123456789"; 

int a=strlen(str); //a=10; 

int b=sizeof(str); //而b=20; 



6.strlen的结果要在执行的时候才干计算出来,时用来计算字符串的长度,不是类型占内存的大小。 





7.sizeof后假设是类型必须加括弧,假设是变量名能够不加括弧。这是由于sizeof是个操作符不是个函数。 



8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 

当适用一静态地空间数组, sizeof 归还所有数组的尺寸。 

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 



9.数组作为參数传给函数时传的是指针而不是数组,传递的是数组的首地址, 

如: 

fun(char [8]) 

fun(char []) 

都等价于 fun(char *) 

在C++里參数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小 

假设想在函数内知道数组的大小, 须要这样做: 

进入函数后用memcpy拷贝出来,长度由还有一个形參传进去 

fun(unsiged char *p1, int len) 



unsigned char* buf = new unsigned char[len+1] 

memcpy(buf, p1, len); 





我们能常在用到 sizeof 和 strlen 的时候,一般是计算字符串数组的长度 

看了上面的详解,发现两者的使用还是有差别的,从这个样例能够看得非常清楚: 



char str[20]="0123456789"; 

int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。 

int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。 



上面是对静态数组处理的结果,假设是对指针,结果就不一样了 



char* ss = "0123456789"; 

sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是 长整型的,所以是4 

sizeof(*ss) 结果 1 ===》*ss是第一个字符 事实上就是获得了字符串的第一位'0' 所占的内存空间,是char类 型的,占了 1 位 

strlen(ss)= 10 >>>> 假设要获得这个字符串的长度,则一定要使用 strlen。

strlen和sizeof的差别的更多相关文章

  1. 注意字符串的strlen与sizeof的差别

    unsigned char AT_RESET[]="r\r\n"; printf("strlen=%d sizeof=%d\n",strlen(AT_RESET ...

  2. c语言中:strlen和sizeof的区别和它们分别交换各自作用领域(\0问题)时的细微差别!!!

    本人c语言初学菜鸟一枚,今天通过敲了一段简单代码,发现strlen和sizeof之间的一些关系,总结如下: 用strlen计算数组长度要考虑进去\0 用sizeof计算字符串长度也要考虑进去\0 而s ...

  3. Strlen()与sizeof()

    在学习C语言时以及面试中,经常会见到strlen()与sizeof()这一对容易混淆的概念,搞清楚这两个概念,往往考察了编程人员对语言的基本掌握能力. 首先大家先明确两个概念是: 1.strlen() ...

  4. C语言——strlen()和sizeof的区别

    strlen()和sizeof()的区别: strlen()——>C字符串库函数,返回字符串的真实长度.它是从内存某位置开始扫描,直到碰到结束符'\0'停止,返回计数器值. sizeof()—— ...

  5. 函数strlen()和sizeof的区别

    函数strlen()和sizeof的区别: #include<stdio.h> #include<stdlib.h> #include<string.h> #def ...

  6. c strlen和sizeof详解

    用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1: char str2[10] = "hello c"; printf("st ...

  7. 关于strlen和sizeof的使用

    在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...

  8. strlen与sizeof

    strlen计算不包括终止符null字节的字符串长度,而sizeof则计算包括终止null字节的长度.另一个差别,strlen需要一次函数调用,而sizeof在编译时计算缓冲区长度.

  9. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

随机推荐

  1. POJ 3007 Organize Your Train part II(哈希链地址法)

    http://poj.org/problem?id=3007 题意 :给你一个字符串,让你无论从什么地方分割,把这个字符串分成两部分s1和s2,然后再求出s3和s4,让你进行组合,看能出来多少种不同的 ...

  2. php数组遍历 使用foreach

    <?php $url = array ( '新浪' =>'www.sina.com' , '雅虎' =>'www.yahoo.com' , '网易' =>'www.163.co ...

  3. 查看jdk的位数

    public class Test { public static void main(String[] args) { System.out.println("bit of JVM is ...

  4. 使用Eclipse调试Android Native Application---cocos2d-x + Eclipse + Android + ndk

    纠结很多天的ndk 调试, 终于在 mac  下面顺利完成(注意在windows还是没弄成功,蛋疼...) 调试方法: 1:先google, ndk demo .  把ndk 最基本的hellword ...

  5. Hello Indigo

    Windows Communication Foundation (WCF),formerly code-named “Indigo,” is Microsoft’s platform for Ser ...

  6. [Hadoop源码解读](四)MapReduce篇之Counter相关类

    当我们定义一个Counter时,我们首先要定义一枚举类型: public static enum MY_COUNTER{ CORRUPTED_DATA_COUNTER, NORMAL_DATA_COU ...

  7. js模拟Map对象,实现key---value

    js模拟Map对象,实现key---value 根据java中map的属性,实现key----value保存 function Map() { var struct = function (key, ...

  8. JS模块化规范CommonJS,AMD,CMD

    模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块.理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可.一个模块化系统所必须的 ...

  9. Using the Task Parallel Library (TPL) for Events

    Using the Task Parallel Library (TPL) for Events The parallel tasks library was introduced with the ...

  10. C语言setjmp函数使用

    C语言中可以使用goto进行程序跳转,但是goto只能使用在一个函数内部,不能实现在不同函数之间的跳转,C语言因此提供了setjmp和longjmp函数实现此功能,一般进行异常处理. 从函数名称可以看 ...