【c语言】 sizeof、strlen计算字符大小长度题目总结概括(详解)

简介: 目录sizeofstrlen

目录


sizeof


strlen


sizeof

sizeof可以理解为一个操作符,其作用简单的说就是返回一个对象或者类型所占的内存字节数。


MSDN上的解释为:


The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.


其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,


一般定义   typedef  unsigned int  size_t;


其有两种语法形式:


one:sizeof(type_name); //sizeof(类型);


two:sizeof object;   //sizeof对象;


举例:(在64位平台上)


one:


int是一种类型,代表整形 所以


sizeof(int)——正确  答案是:4


sizeof    int   ——错误


two:


int i;


sizeof(i)——正确  答案是:4


sizeof    i   ——正确  答案是:4


(i即可当作int整形,也可以被当作操作对象)


那么当 sizeof后面跟的是一个数时呢?


举例:


one:


sizeof  5  ——  5 会被计算机当作整形,相当于 sizeof(int)——答案是:4


two:


sizeof  3.1415926 ——3.14515926会被当作双精度浮点型,相当于 sizeof(double)——答案是:8


接下来讨论指针中的sizeof:


在32位系统中,一个指针变量的sizeof值通常是4


在64位系统中,一个指针变量的sizeof值通常为8 (以字节为单位)。


也就是说,不管你是int*、char*、float*、doudle* 等等。只要你是sizeof 一个指针,不管指针所指的对象是什么,得到的结果不是4就是8,这取决于你使用的计算机是32位还是64为操作系统。


下面是一道经典的笔试题:




解析:(单位为字节)


sizeof(arr)--——--表示计算数组整体的大小。(字符串末尾还有一个‘\0’所以答案为6+1=7)


sizeof(arr+0)--——--表示计算首元素地址大小。(只要是地址,不是4就是8,取决32位/64位)


sizeof(*arr)--——--表示计算首元素字节大小。(字符‘a’,char类型,所以字节大小是1)


sizeof(arr[1])--——--表示计算第二个元素字节大小(字符‘b’,所以字节大小是1)


sizeof(&arr)--——--表示计算arr数组地址的大小(&数组名 表示取出整个数组的地址)(地址)


sizeof(&arr+1)--——--表示计算跳过整个数组后的地址大小(但也是地址)


sizeof(&arr[0]+1)--——--表示计算第二个元素的地址大小(但也是地址)


strlen

strlen是一个函数,用来测量字符串实际长度(不包括‘\0’)。


strlen是STRing LENgth的缩写,除此之外strlen只能用char*做参数,且必须是以''\0''结尾的


简单功能如下:


char str[10] = "china";

printf("%d\n", strlen(str));

//结果如下:

5

D:\VS\Project4\x64\Debug\Project4.exe (进程 16032)已退出,代码为 0。

按任意键关闭此窗口. . .

下面是几个经典题目:




先说正确的吧:


strlen(arr)--——--计算数组整体长度,arr代表了数组首元素地址(计算结果是6)


strlen(arr+0)--——--和strlen(arr)一样(计算结果是6)


strlen(&arr[0]+1)--——--表示跳过第一个元素开始计算长度(计算结果是5)


至于为什么中间4个会报错呢?我们仔细来分析一下:


strlen (*arr) --——--对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',而strlen遇到'\0'才会停止,所以这种写法就是错误的。


strlen (arr[1]) --——--同理可得,strlen(arr[1])也是错误的。


strlen (&arr) --——--&arr表示整个数组的地址,为什么也不行呢?


提示:" const char *" 类型 的 实参 与 " char *" 类型 的 形参不兼容, 函数 形参 为 char *的 类型 直接写入字符串报错。 于是我抱着试一试的心态到linux平台上用gcc运行了一下,请看结果:


[bsk@localhost test1]$  gcc test.c

test.c: In function ‘main’:

test.c:6:1: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]

printf("%d\n",strlen(&arr));

^

In file included from test.c:2:0:

/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char (*)[7]’

extern size_t strlen (const char *__s)

              ^

[bsk@localhost test1]$ ls

a.out  dir1  file.txt  test.c

[bsk@localhost test1]$ ./a.out

6

[bsk@localhost test1]$ ^C


虽然给我提示警告了,但还是运行过去了。那strlen(&arr+1)呢?


[bsk@localhost test1]$ vim test.c

[bsk@localhost test1]$ gcc test.c

test.c: In function ‘main’:

test.c:6:1: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]

printf("%d\n",strlen(&arr+1));

^

In file included from test.c:2:0:

/usr/include/string.h:395:15: note: expected ‘const char *’ but argument is of type ‘char (*)[7]’

extern size_t strlen (const char *__s)

              ^

[bsk@localhost test1]$ ls

a.out  dir1  file.txt  test.c

[bsk@localhost test1]$ ./a.out

0

[bsk@localhost test1]$


也成功运行了,但结果是一个随机值。由此可见vs的严谨性!!!



目录
相关文章
|
6天前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
172 15
|
7月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
542 11
|
7月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
7月前
|
存储 C语言 开发者
【C语言】格式化输出占位符及其标志字符详解(基于ISO/IEC 9899:2024)
在C语言中,格式化输出通过 `printf` 函数等格式化输出函数来实现。格式说明符(占位符)定义了数据的输出方式,标准ISO/IEC 9899:2024(C23)对这些格式说明符进行了详细规定。本文将详细讲解格式说明符的组成部分,包括标志字符、宽度、精度、长度修饰符和类型字符,并适当增加表格说明。
342 6
|
7月前
|
C语言
【C语言】sizeof 关键字详解
`sizeof` 关键字在C语言中用于计算数据类型或变量在内存中占用的字节数。它是一个编译时操作符,对性能没有影响。`sizeof` 可以用于基本数据类型、数组、结构体、指针等,了解和正确使用 `sizeof` 对于内存管理和调试程序非常重要。
249 2
|
8月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
419 4
|
9月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
166 1
|
9月前
|
C语言
C语言字符(串)函数
C语言字符(串)函数
|
9月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
9月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲