本文转载自:http://www.2cto.com/kf/201109/105100.html

1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".

2. 字符串直接量作为字符指针的初始值
  "hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,
即使程序  中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于 const char *ptr = “hello”;
字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = ‘a’;是会引起错误的。
3. 字符串直接量作为基于栈的字符数组的初始值
    由于基于栈的变量不可能引用其他地方存储的内存,编译器会负责将字符串直接量复制到基于栈的数组内存中。
    例如: char stackArray[] = “hello”;
    做如下修改: stackArray[1] = ‘a’;是真确的。
4. 字符数组与字符指针
    字符数组的形式如下,会将字符直接量拷贝到栈上:
          char str[]   = "abc";             // 实际的数据存储: a b c \0,也就是增加了一个终结符\0
          char str[3] = {'a','b','c'};     // 实际的数据存储: a b c,并没有在最后添加终结符
          char str[10] = {'a','b','c'};   // 实际的数据存储: a b c \0 \0 \0 \0 \0 \0 \0
   字符指针的形式如下:
          char *str = “abc”;               // 实际的数据存储: a b c \0,也就是增加了一个终结符\0
5. 类型的决定
    1). 数组的类型是由该数组所存放元素的类型以及数组本身的大小决定的
         如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

    2). 字符串常量的类型可以理解为相应字符常量数组的类型  如"abcdef"的类型就可以看成是const char[7],也就是说实际的数据存储为"abcdef\0"。

    3). 函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型
         如对于void func(char sa[100],int ia[20],char *p),则sa的类型为char*,ia的类型为int*,p的类型为char*。
对于sizeof与strlen:
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof是算符,strlen是函数。
3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5. 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
    char str[20]="0123456789"; // str是编译期大小已经固定的数组
     int a=strlen(str); //  a=10; //strlen()在运行起确定,计算的是实际长度
     int b=sizeof(str); //  而b=20; //sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小
6. strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。

7. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
    char c;
    sizeof c;  //变量名可以不加括弧
8. 当适用于一个结构类型或变量, sizeof 返回实际的大小,
    当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
    sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
sizeof、strlen计算字符数组、字符指针空间

char str[] = "abc";  实际的数据存储: a b c \0,也就是增加了一个终结符\0 其类型为char[4]   VS: sizeof(str)=4     strlen(str) = 3
GCC: sizeof(str)=4     strlen(str) = 3
char str[]   = "abc"; 实际的数据存储: a b c \0,也就是增加了一个终结符\0 其类型为char[4]   VS: sizeof(str)=4     strlen(str) = 3
GCC: sizeof(str)=4     strlen(str) = 3
char str[] = {'a','b','c'}; 实际的数据存储: a b c,并没有在最后添加终结符 其类型为char[3]   VS: sizeof(str)=3     strlen(str) = 15
GCC: sizeof(str)=3     strlen(str) = 6
char str[3] = {'a','b','c'}; 实际的数据存储: a b c,并没有在最后添加终结符 其类型为char[3]   VS: sizeof(str)=3     strlen(str) = 15
GCC: sizeof(str)=3     strlen(str) = 6
char str[5] = {'a','b','c','d','e'};  实际的数据存储: a b c d e ,并没有在最后添加终结符 其类型为char[5]   VS: sizeof(str)=5     strlen(str) = 19
GCC: sizeof(str)=5     strlen(str) = 8
char str[5] = {'a','b','c','d'};


实际的数据存储: a b c d \0(默认填充字符\0) 其类型为char[5]   VS: sizeof(str)=5     strlen(str) = 4
GCC: sizeof(str)=5     strlen(str) = 4
char *pstr = "abcde"; 实际的数据存储: a b c d e \0 pstr的类型为char* sizeof(pstr) = 4 ( 指针的数据存储空间,4个字节),strlen(pstr) = 5
总结一下:
1). sizeof的结果是类型的大小,区分类型之后,sizeof的结果也就命了,sizeof的结果是在编译期决定的,计算的占据的内存大小。
     srelen的结果是在运行期间决定,计算的是实际长度,strlen只能以char*作参数,以\0作为结束符, 以上的例子中,红色部分的strlen计算是错误的,
     因为在str的数据存储中并没有 一个\0字符,所以strlen的结果看似有点异常。
2). 注意在计算sizeof的时候:
     char str[] = "abc";  类型为char[4],   sizeof(str) = 4*sizeof(char) = 4.
3). sizeof(express),其中的express在编译过程中是不会被编译的,而是被替代类型。
     例如: int a = 1; sizeof(a=2);
     此时的express为a=2,在编译过程中被替换为sizeof(int),所以在执行完之后,a仍然是等于1.
4). 对函数使用sizeof,在编译阶段会被替换为函数的返回值的类型取代
     例如: int f(){return 0;}  sizeof(f());的结果为4.
             void f(){}            sizeof(f());编译过程中会出现错误,替换之后的sizoeof(void)编译无法通过.

C语言中sizeof与strlen区别相关推荐

  1. c语言sizeof strlen,C语言中sizeof与strlen区别

    一.本质区别 sizeof 和strlen 有本质上的区别.sizeof 是C 语言的一种单目运算符,如++.--等,并不是函数,sizeof 的优先级为2 级,比/.% 等3 级运算符优先级高,si ...

  2. C语言中sizeof与strlen的区别总结!

    C语言中sizeof与strlen区别总结! 先上一个例子: 结果: 一.sizeof与strlen char c[] = "abc\0cba"; 问题1:sizeof(c) = ...

  3. C语言中sizeof和strlen的区别是什么

    C语言中sizeof和strlen的区别是:strlen是一个函数,用来计算指定字符串str的长度,但不包括结束字符(即null字符):而sizeof是一个单目运算符,不是函数. 区别分析: strl ...

  4. c语言中strlen用到的头文件,C语言中sizeof()与strlen()函数的使用入门及对比

    sizeof()函数1,是什么? sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换.虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是 ...

  5. c语言sizeof啥作用,C语言中sizeof什么意思

    C语言中"SIZEOF(INT)"是什么意思?有什么作用? C语言中,sizeof是一个? sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符:sizeof是计算 ...

  6. c语言中sizeof函数的作用是,c语言中sizeof函数的用法

    C语言sizeof函数如何使用? 怎样利用sizeofCSS布局HTML小编今天和大家分享各种数据类型占用的字节数? (1)sizeof不是函数,它只是一个操作符(operator). (2)size ...

  7. C语言中fscanf的作用,C语言中fgets和fscanf区别详解

    搜索热词 C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往 ...

  8. c语言中的fscanf是啥意思,详解C语言中fgets和fscanf区别

    fscanf函数是C语言的文件格式读取函数的方法之一,它使用空格.制表符和回车来分割不同的单词,这样可以让我们使用起来更方便,下面就让爱站技术频道小编带你来学习详解C语言中fgets和fscanf区别 ...

  9. c语言中size of 用法,C语言中sizeof()的用法

    要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在 ...

最新文章

  1. CNN、RNN、DNN的内部网络结构有什么区别?
  2. java12小时制的时间转换为24小时制
  3. linux nat软件,linux下nat的应用(转)
  4. 计算机图形学画圆和直线代码,计算机图形学作业(中点法画直线和八分画圆法).doc...
  5. mysql heartbeat 高可用
  6. 汇顶科技2021秋招笔试
  7. 大脑应对危机的模式_危机的完整形式是什么?
  8. android安全补丁卸载,这种安全更新能不卸载就不卸载
  9. 百度的一道 java 高频面试题的多种解法
  10. vue根据屏幕大小适配表格高度
  11. cdq分治 陌上花开(内无题解)
  12. php ddos 防御,PHP DDos的几个防御方法
  13. 《Android MVPArms 使用butterknife遇到的坑》
  14. 为大众而写的程序员小说——从《简单易懂的现代魔法》说开去。
  15. c语言函数大全 chm,c语言常用函数手册 chm格式.doc
  16. SQL --用户数据维护
  17. 域名解析成ip的过程
  18. 昆明新迎万枫、菏泽希尔顿花园酒店​开业;万豪在华运营酒店超过400家 | 中国酒店周刊...
  19. 一款实用的web截图工具(一)
  20. 经典激光雷达SLAM系统:LOAM-Livox

热门文章

  1. Java核心技术卷I基础知识3.6.6 码点与代码单元
  2. Oracle数据库的impdp导入操作以及dba_directories使用方法
  3. WIndows 下安装mysql (non-install版本,即绿色版,或称为 源码包)
  4. 微软职位内部推荐-Software Engineer II
  5. C语言自学《八》---- C语言知识总结
  6. Android/Ophone中的悬浮对话框和即点即关对话框
  7. 决心开始写博,坚持!
  8. [转]verilog语法学习心得
  9. 《Java程序员,上班那点事儿》图书有奖征文图书奖品名单
  10. Perl通过WIN32 OLE来操作EXCEL