sizeof 与strlen的区别

复习到数据结构一章,现在贴出sizeof 与strlen的区别,大都是从网上百度而来,做了一下整理,写了几个测试代码。

sizeof:


sizeof(.....) 是一种运算符,不是函数,所以你不要想在头文件里找到的它。sizeof的结果类型为size_t,也就是unsigned int 型。unsigned  int 类型

在stdio.h头文件中被typedef为size_t,如图所示

sizeof的功能是获得保证能容纳实现所建立的最大对象的字节大小。说白了就是计算某种参数所占内存的大小。它不受存储内容的影响。其值是在编

译的时候计算好了的,是为什么 sizeof 可以用来定义数组大小的原因。这也是 sizeof 不能用来返回动态分配内存的大小的原因。

具体而言,当 sizeof 参数如下时,返回值表示含义如下:

1、数组 :

              当参数为数组时, sizeof 返回的是数组所占内存空几间的大小如:

              char str[20]={"123456789"};

              sizeof(str)  的结果为20, char 在32位机器上占一个字节,所以结果为 1 x 20;

              如果是 

              int dat[9] = {1,2,3,4,5,6,7,8,9};

              sizeof(dat)  的结果是36, int 在32位机器上占四个字节,所以结果为 4 x 9 ;

             有三点需加以说明,

            (1) 当数组作为传递参数时,不会退化为指针。这与 strlen 不同。

            (2) 它的返回结果与数组存储内容无关,只要你定义了一个数组,如上面的dat[9] 和 str[20],不管数组是空还是满,结果都是不变的。

            (3) 当传递的参数是静态的空间数组时,sizeof 将返回全部数组的尺寸。

2 、指针:

     当参数是指针时, sizeof 返回的是存储该指针所用空间的大小,也就是与指针的数据类型有关如:
     int *p;
     sizeof(p) 的结果为4,因为32位机器上的指针当然是32位,即4个字节,所以需要4个字节的内存空间保存,而sizeof就是求参数所占内存空间的大小。
     如果p是char型的,即:
     char *p;

     sizeof(p) 的结果是为1吗?当然不是,应该是4。刚才上面说的,在32位机器上,指针是4个字节的,所以保存指针的内存空间是4个字节。定义指针时前面的类          型名只是说明该指针指向的是该类型的变量,就像int *p ,只是说明p指向的是整型变量的地址,而char *p 说明它指向的是字符变量的地址。所以注意当     

     sizeof的参数为指针时,它的结果只与机器有关,而与指针的指向无关,不管是char    int   struct还是 union类型,也不管是否给它赋值 。再看下面这个例子:

     int *p[10];  

     sizeof(p)的结果为 40,即 4 x 10,原理还是一样。

3、函数:

             当参数为函数时,返回的结果是函数返回值所占内存空间的大小,当然不能是无返回值的函数,即void 类型函数,例如。

             int a ,b;

             int    fun1();

             char fun2();

              a = sizeof(fun1());

              b = sizeof(fun2());

              则在32位机器上,a的值是4,b的值是1。

4、类型:

             sizeof的参数可以是构造类型,如结构体,联合体。下面各举一例。

             struct  STU

                              {

                               int a;

                               int b;

                               char c;

                               }student;

           则在32位机器上,sizeof(student) 的结果为12。这个结果可能出乎大家意料,这涉及到内存空洞的问题,这里不多讨论


          

              union STU

                              {

                               int a;

                               int b;

                               char c;

                               }student;

           则在32位机器上,sizeof(student) 的结果为4。

5、对象:

             当参数为对象时,返回的是该对象所占内存空间的大小。由于对对象我还没学习到,这里就不多说。


还有最后一点,如果后面的参数是类型时如 int  char 或定义的结构体类型时,sizeof 后面的括号不能省,当是变量时,则可省略。因为 sizeof 是运算符,而并非函数。


strlen :

    

strlen是一个函数,在 string.h 头文件里有定义。由于strlen()是一个函数,所以它要在程序运行时才能计算,它的参数只能是字符型指针(char *str),即只能对字符串进行操作。它是用来计算一个以 '\0' 结束的字符串的长度,即字符的个数,但不包括'\0'。strlen返回的结果受字符串数组内容的影响。下面举几个例子:

eg 1:

        char  str[11] = {"1234567890"};

        则strlen(str) 的结果是 10,因为str里面有10个字符。注意,在定义字符串数组时,字符串大小要比你所放字符个数多一个,因为编译器会自动在后面加一个'\0'结束标         。因此你指定的字符串数组大小必须要比字符个数多一个。要么就不指定大小,如  char  str[] = {"1234567890"};  这只适合在赋初值的情况。

eg 2:

       char  str[12] ={'12345\067890'};

       则strlen(str) 的结果是5,因为遇到'\0'时就结束。如果是  char  str[12] ={'\01234567890'};  结果就是0。

当数组名作为参数传递给strlen时,数组就会退化成指针,指向字符串的首址。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值