字符串 前篇 ---- sizeof()操作符和strlen()库函数

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

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

1.sizeof() 基本介绍

 1     printf("int: %d\n", sizeof(int));
 2     printf("char: %d\n", sizeof(char));
 3     printf("int*: %d\n", sizeof(int *));
 4     printf("char*: %d\n", sizeof(char *));
 5     printf("short: %d\n", sizeof(short));
 6     printf("float: %d\n", sizeof(float));
 7     printf("double: %d\n", sizeof(double));
 8     printf("long: %d\n", sizeof(long));
 9     printf("long long: %d\n", sizeof(long long));
10     printf("unsinged int: %d\n", sizeof(unsigned int));
11     printf("unsigned char: %d\n", sizeof(unsigned char));
12     printf("unsigned short: %d\n", sizeof(unsigned short));
13     printf("unsigned long: %d\n", sizeof(unsigned long));
14     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个比较深奥的问题。

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 才返回。

 1 #include <stdio.h>
 2 #include <string>
 3 using namespace std;
 4 void main()
 5 {
 6     char arr[] = "hello";
 7     int iLen = strlen(arr);
 8
 9     string str3 = "hello";
10     int iLen3 = strlen(str3.c_str());
11     printf("******************************************\n");
12     getchar();
13 }

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] 所占的内存空间的大小,不受里面存储的内容改变。

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

时间: 2024-10-13 09:47:28

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

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

sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof expr 在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof并不需要真的解引用指针也能知道它所指对象的类型. sizeof对C++的所有内置类型求其所占空间的大小: 环境:win7 64-bits, Code::Blocks 16.01,

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

摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和strlen的区别: sizeof的用法: sizeof 是一种单目操作符,而不是函数.sizeof以字节形式给出操作数的存储空间. 操作数可以是一个表达式或在括号内的类型名.操作数的存储空间由操作数的类型决定. char str[]="hello"; char str1[100]; ch

内存及字符串操作篇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> 定义函数 int bcmp ( const void *s1,const void * s2,int n); 函数说明 bcmp()用来比较s1和s2所指的内存区间前n个字节,若参数n为0,则返回0. 返回值 若参数s1 和s2 所指的内存内容都完全相同则返回0 值,否则返回非零值. 附加说明 建议使用memc

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

导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&

sizeof运算符、strlen()函数和转义字符

本篇文章posted on 2019-12-23 12:58 本人之前写过一篇类似的文章(链接:sizeof运算符和strlen()函数),也比较深入,但是和本篇相比,本篇更加深入. 首先请看下面的代码,这个代码应该输出什么. 下面是C语言代码. 1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a=2,b=0; 6 sizeof(b=a++); 7 printf("a=%d,b=%d\n",a,b); 8 return 0;

【C++ Primer每日一刷之十二】 箭头操作符,条件操作符,sizeof操作符,逗号,优先级

5.6. 箭头操作符 C++ 语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->).点操作符(第 1.5.2 节)用于获取类类型对象的成员: item1.same_isbn(item2); // run thesame_isbn member of item1 如果有一个指向 Sales_item 对象的指针(或迭代器),则在使用点操作符 前,需对该指针(或迭代器)进行解引用: Sales_item *sp = &item1; (*sp).same_isbn(item

从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║ Vue前篇:ES6初体验 &amp; 模块化

缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很感兴趣,嗯~~这一块确实挺枯燥的,不能直接拿来代码跑一下那种,不过还是得说下去,继续加油吧!如果大家对昨天的小demo练习的话,相信现在已经对JS的面向对象写法很熟悉了,如果嵌套字面量定义函数,如何使用this关键字指向.今天呢,主要说一下ES6中的一些特性技巧,然后简单说一下模块化的问题,好啦,开始今天的讲

python学习之 字符串前&#39;r&#39;的用法

python学习之 字符串前'r'的用法 在打开文件的时候open(r'c:\....') 加r和不加''r是有区别的 'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子 在字符串赋值的时候 前面加'r'可以防止字符串在时候的时候不被转义 原理是在转义字符前加'\' 例: s=r'\tt' print(s) Output: '\tt' s='\tt' print(s) Output: '        t' python学习之

【Linux】数据流重导向(前篇)

数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了! 1)什么是数据流重导向? 什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的: 我们运行一个命令的时候,这个命令可