本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖。希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法)。我们只做 实用意义 的介绍和讨论。

在介绍字符串之前,先介绍 sizeof()操作符 、 strlen()库函数。

1.sizeof() 基本介绍

     printf("int: %d\n", sizeof(int));
printf("char: %d\n", sizeof(char));
printf("int*: %d\n", sizeof(int *));
printf("char*: %d\n", sizeof(char *));
printf("short: %d\n", sizeof(short));
printf("float: %d\n", sizeof(float));
printf("double: %d\n", sizeof(double));
printf("long: %d\n", sizeof(long));
printf("long long: %d\n", sizeof(long long));
printf("unsinged int: %d\n", sizeof(unsigned int));
printf("unsigned char: %d\n", sizeof(unsigned char));
printf("unsigned short: %d\n", sizeof(unsigned short));
printf("unsigned long: %d\n", sizeof(unsigned long));
printf("******************************************\n");

1.1 sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
    具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

1.2 sizeof()的基本知识,不过多介绍。下面讲几个重点(面试题常考):

sizeof(int)的 值是 4  个字节;

sizeof(指针) 的值是 4 个字节;

sizeof(char) 的值是 1 个字节; 

char szStr1[20] = {0};

int  szStr2[20] = {0};

sizeof(szStr1)  结果是: 20   // 20个 char 的数组,在内存中,占用 20 * 1个 字节空间

sizeof(szStr2) 结果是: 80    // 20个 int 的数组,在内存中 占用 20 * 4 个字节空间

1.3 数组和指针的区别、 sizeof()结构体的内存对齐问题,这2个知识点先跳过,以后会讨论;

2.strlen 基本介绍

2.1 strlen(...)是函数,要在运行时才能计算。使用strlen()的时候,需要 #include <string>

参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

2.2 计算字符长度.

char arr[] = "hello";  strlen(arr) 的结果是 5

char arr[5] = "hello";  这样定义,编译阶段都会报错定义一个常量字符串的时候,字符串末尾是默认的会加上一个'\0'结束符。因此,"hello" 字符串 需要 6个字节 的空间。

char arr[10] = "Hello";  strlen(arr) 的结果是 5 . 虽然"Hello"字符串占用了6个字节的空间,但是strlen计算长度的时候,没有将字符结束符"\0"计算在内,因此返回的长度是 5。

char arr[5] = {'h', 'e', 'l', 'l', 'o'};  /// 这定义的仅仅是一个字符数组,不是一个字符串(字符串后面必须有\0 结尾)
int iLen = strlen(arr);   //// 因此,在使用strlen计算长度的时候,得到的结果是一个未知的整数。strlen 在内存中,从arr地址开始,不断向后找查找,直到找到 \0 才返回。

 #include <stdio.h>
#include <string>
using namespace std;
void main()
{
char arr[] = "hello";
int iLen = strlen(arr); string str3 = "hello";
int iLen3 = strlen(str3.c_str());
printf("******************************************\n");
getchar();
}

strlen

3.sizeof() 和 strlen() 的区别

3.1 sizeof是算符,strlen是函数

3.2 sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的

3.3 数组做sizeof的参数不退化,传递给strlen就退化为指针了

3.4示例:

3.4.1 静态数组

char str[20]="0123456789"; 
int a=strlen(str);     ///// a=10 strlen 计算字符串的长度,以结束符 0x00 为字符串结束
int b=sizeof(str);    // 而 b=20  sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。

char  str2[] = "hello";

int c = sizeof(str2); /// c=6. 

3.4.2 指针

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

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

strlen(ss)结果 10       要想获取一个字符串的长度,需要使用 strlen() 函数、

3.4.3 常量字符串

int iLen1 = strlen("hello");   /// iLen1=5

int iSize = sizeof("hello");    ///  iSize=6 . 面试题中,容易混淆! sizeof("hello")中,"hello"被当做数组处理的,而不是指针。(知道是这么回事就OK了、)

char* str3 = "hello";

int iSize3 = sizeof(str3);   /// iSize3=4, sizeof(str3)计算的是一个指针所占 内存空间的大小,指针所占内存空间大小是 4个字节。

参考链接:

http://www.cnblogs.com/carekee/articles/1630789.html

字符串 前篇 ---- sizeof()操作符和strlen()库函数的更多相关文章

  1. C++中sizeof操作符与strlen函数

    sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...

  2. 逗号字符的使用、字符数组与字符串数组、sizeof与strlen

    (1)连接两个表达式为一个表达式 for(ux=0,uxt=1;uxt<444;ux++,uxt++) 允许通过编译:他可以给FOR循环更多的初始化值: (2)一般定义的话要区别只有 字符数组 ...

  3. Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)

    Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是:  i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...

  4. C语言strlen函数和sizeof操作符

    字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...

  5. C++ sizeof操作符的用法和strlen函数的区别

    摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...

  6. 内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset

    bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...

  7. 字符串的sizeof长度及strlen长度

    在C/C++中,字符串是以零('\0')结尾的.比如,对于下面的字符串: "hello"  在最后一个字符'd'后面,还有一个我们肉眼看不见的'\0'字符,作为该字符串的结束符.所 ...

  8. sizeof操作符-结构体与类大小

    导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...

  9. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

随机推荐

  1. A Tour of Go Map literals continued

    If the top-level type is just a type name, you can omit it from the elements of the literal. package ...

  2. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  3. hdoj 1859 最小长方形

    最小长方形 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. 转载 ASP.NET中如何取得Request URL的各个部分

    转载原地址 http://blog.miniasp.com/post/2008/02/10/How-Do-I-Get-Paths-and-URL-fragments-from-the-HttpRequ ...

  5. 背景透明文字不透明的最佳方法兼容IE(以背景黑色透明度0.5为例)

    以背景黑色,透明度0.5举例为大家详细介绍下关于背景透明,文字不透明的最佳方法同时兼容IE,具体实现如下,感兴趣的朋友可以参考下哈希望对大家有所帮助 以背景黑色,透明度0.5举例 非IE:backgr ...

  6. XML操作之Linq to Xml

    需要引用的命名空间:   using System.Xml.Linq; 常用的类:XDocument.XElement.XAttribute 创建 XDocument对象. XDocument.Loa ...

  7. Weblogic常见故障一:JDBC Connection Pools

    最近系统老是出现数据库连接池不够用的问题,由于weblogic数据源里没有配置JDBC连接数,取的是默认值15,太小导致connection耗尽,是不是就报一堆错.后来通过修改WebLogic数据源配 ...

  8. Android设计模式—策略模式

    1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算 ...

  9. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...

  10. 教你50招提升ASP.NET性能(七):总是在服务器端执行验证

    (13)Always perform validation on the server as well 招数13: 总是在服务器端执行验证 This isn’t exactly a performan ...