• C语言strlen函数和sizeof操作符


    字符'x'于字符串"x"的区别

      'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x')

      "x"属于派生类型(char数组)字符串类型-----------由2个字符组成('x'和空字符'')

      

    strlen函数与sizeof操作符

      

      strlen函数原型为 extern int strlen(char *s) ,用来计算字符串s的长度(不包括''),使用时需要引入头文件 #include <string.h> 

      sizeof是C语言的一种单目操作符,同其他操作符++、--等类似,它并不是函数。其作用就是返回一个对象或者类型所占的内存字节数

      sizeof的示例程序:

    #include <stdio.h>
    
    int main(void)
    {
        char* str1="absde";        //指向字符串的指针
        char str2[]="absde";
        char str3[8]={'a',};
        printf("sizeof(str1) = %d
    ",sizeof(str1));
        printf("sizeof(str2) = %d
    ",sizeof(str2));
        printf("sizeof(str3) = %d
    ",sizeof(str3));
    
        return 0;
    }

      

      运行结果:

      

      

      【分析】

      str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。在C/C++中一个指针占4个字节,所以sizeof(str1)=4

      str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的内存空间。"absde"中,共有'a','b','s','d','e',''六个字符,所以sizeof(str2)=6*sizeof(char)=6

      str3已经定义成了长度是8的字符数组,分配了8个字节的内存空间,所以sizeof(str3)=8

      总之,对于指针,sizeof操作符返回这个指针占的内存空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而char* str1="absde"的写法现在也不被提倡,应予以避免。

      关于二者的区别可见以下程序

    #include <stdio.h>
    #include <string.h>        //strlen函数的头文件
    #define PRAISE "What a super marvelous name!"    //测试字符串
    int main(void)
    {
        char name[40] = "Wsying";    //测试字符串
        printf("strlen = %d        sizeof = %d
    ",strlen(name), sizeof(name));
        printf("strlen = %d        sizeof = %d
    ",strlen(PRAISE), sizeof(PRAISE));
    
        return 0;
    }

      运行结果:

      

      【分析】

      对于name这个字符数组(字符串),strlen的返回值6恰好为"wsying"的长度(‘’之前停止计数);因为我们声明了name数组包含了40个单位的char型,1个char型在内存中占据1个字节,所以sizeof的运算结果为name在内存中占据的字节数为40;

      对于PRAISE(即"What a super marvelous name!")这个字符串,sizeof运算结果比strlen的结果大1,字符串占据的字节数(char类型仅占1个字节)比他的长度大1,这是因为sizeof把结束字符''也算进去了(''也要占据内存空间),我们并没有像name那样定义为这个字符串分配多大内存,计算机自己计算它占据的字节数。

  • 相关阅读:
    栈的应用之银行叫号系统模拟
    栈的应用之括号匹配
    栈的应用之数制转换
    线性结构 一元多项式的乘法与加法运算
    Checkpoints codeforces 709B
    寒冰王座 hdu 1248(背包)
    单链表头插法、尾插法(26个字母为例)
    两个有序单链表的合并
    Number Sequence HDU 1711(KMP)
    完成运算
  • 原文地址:https://www.cnblogs.com/eniac12/p/4754677.html
Copyright © 2020-2023  润新知