zoukankan      html  css  js  c++  java
  • Strlen()与sizeof()

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

    首先大家先明确两个概念是:

    1.strlen()是函数,而sizeof()是表面看起来像函数的关键字。

    2.Strlen()求得是长度,针对的对象是字符串,而sizeof()求的是大小针对的是类型

    之所以二者经常混淆,那是由于在使用过程中未能正确区分哪个是求长度,哪个是求大小,下面就具体讲解sizeof()strlen()在各种情况下的长度与大小。

    情况1

    void main()

    {

       char str[]=”hello C”;

       printf(“strlen()=%d ”,strlen(str));

       printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果:strlen()=7

              sizeof()=8

        由于在用字符初始化数组时,系统会在字符串末尾自动加上一个’’作为字符的结束标记,因此用sizeof()求出的长度就比strlen()有效长度大1

    情况2

    void main()

    {

        char str[10]=”hello C”;

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

     执行结果:strlen()=7

              sizeof()=10

        数组名str代表了整个空间的大小,因此sizeof()10

    情况3

    void main()

    {

        char str[]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    运行结果:strlen()=11

              sizeof()=7

    由于在初始化str时没有,所以strlen()为随机值,而大小就为字符初始化后所占空间的个数。

    情况4

    void main()

    {

        char str[10]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果:strlen()=7

              sizeof()=10

       由于str未完全初始化,数组剩下的位置用0来填充(‘’就是字符0的转意,即0),所以不难看理解str后面的0相当于’’,所以strlen(str)的长度为7,而sizeof(str)为数组空间的大小。

    情况5与情况6

    void main()

    {

        char str[10];

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果:strlen()=15

              sizeof()=10

       sizeof()为数组的大小为10,这毫无疑问,但此时strlen()为随机值。

    char str[10];

    void main()

    {

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果:strlen()=0

              sizeof()=10

        当把数组变为全局的时,strlen()则变为0,原因是全局变量生成在静态常量区,初始值为0,而情况5str数组是局部变量,局部变量生成在栈区,初始值为随机值。

    情况7

    void main()

    {

        char *str=”hello C”;

        printf(“strlen()=%d ”,strlen(str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果:strlen()=7

              sizeof()=4

       由于sizeof()求的是类型的大小而str的类型是指针,因此在32位系统下sizeof()=4;同样的无论是数组指针,函数指针,只要是指针它的sizeof()都等于4

    情况8

    void main()

    {

        char *str[3]={”hello C”,”abcd”,”xyz”};

        //printf(“strlen()=%d ”,strlen(*str));

        printf(“sizeof()=%d ”,sizeof(str));

    }

    运行结果: sizeof()=12  strlen(*str)=7//无法求str的有效长度,但是可以求*str的有效长度,即首元素的有效长度

    str为指针数组,里面包含了三个指针,所以32它的大小为三个指针类型的大小,即它的sizeof()32位系统下为3*4=12

    情况9

    当函数用数组做参数时,数组会退化为指针。

    以上的九种情况是笔试题中常考的几种类型,相信只要掌握好了,以后遇上这类型题也就迎刃而解了。

  • 相关阅读:
    初学Java——数组
    Ubuntu下将软件添加到快捷启动栏的问题
    初学Java——方法
    初学Java——选择
    初学Java——常用类之Math笔记
    初学Java——基本程序设计笔记(2)
    初学Java——基本程序设计笔记(1)
    关于IE浏览器里修改元素style属性的问题
    2.22,2.24工作进度
    2.21工作进度
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5678923.html
Copyright © 2011-2022 走看看