strlen()和sizeof()的区别

简介: strlen()和sizeof()的区别

1.strlen()是一个函数,sizeof()是操作符

2.strlen()中必须存放地址,若存放的是一个常量,则会报错,其工作原理是从地址开始到'\0'结束,而返回结果不包括’\0’;

sizeof()中可存放如下:

  • 数组:编译时分配的数组空间大小
  • 指针:存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)
  • 类型:该类型所占的空间大小
  • 对象:对象的实际占用空间大小
  • 函数:函数的返回类型所占的空间大小.函数的返回类型不能是void

3.编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来.并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度.

题目练习+答案:

//一维数组

int a[] = {1,2,3,4};

printf("%d\n",sizeof(a)); ——16

printf("%d\n",sizeof(a+0));——4或8(X86和X64CPU的位数来决定

printf("%d\n",sizeof(*a));——4(int型变量)

printf("%d\n",sizeof(a+1));——4或8

printf("%d\n",sizeof(a[1]));——4

printf("%d\n",sizeof(&a));——4或8

printf("%d\n",sizeof(*&a));——16

printf("%d\n",sizeof(&a+1));——4或8

printf("%d\n",sizeof(&a[0]));——4或8

printf("%d\n",sizeof(&a[0]+1));——4或8

//字符数组

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));——6

printf("%d\n", sizeof(arr+0));——4或8

printf("%d\n", sizeof(*arr));——1

printf("%d\n", sizeof(arr[1]));——1

printf("%d\n", sizeof(&arr));——4或8

printf("%d\n", sizeof(&arr+1));——4或8

printf("%d\n", sizeof(&arr[0]+1));——4或8

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", strlen(arr));——随机

printf("%d\n", strlen(arr+0));——随机

printf("%d\n", strlen(*arr));——err

printf("%d\n", strlen(arr[1]));——err

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

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

printf("%d\n", strlen(&arr[0]+1));——随机


char arr[] = "abcdef";

printf("%d\n", sizeof(arr));——7

printf("%d\n", sizeof(arr+0));——4或8

printf("%d\n", sizeof(*arr));——1

printf("%d\n", sizeof(arr[1]));——1

printf("%d\n", sizeof(&arr)); ——4或8

printf("%d\n", sizeof(&arr+1)); ——4或8

printf("%d\n", sizeof(&arr[0]+1)); ——4或8

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

printf("%d\n", strlen(arr+0));——6

 printf("%d\n", strlen(*arr)); ——err

printf("%d\n", strlen(arr[1])); ——err

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

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

printf("%d\n", strlen(&arr[0]+1));——5

char *p = "abcdef";

printf("%d\n", sizeof(p)); ——4或8

printf("%d\n", sizeof(p+1)); ——4或8

printf("%d\n", sizeof(*p));——1

printf("%d\n", sizeof(p[0]));——1

printf("%d\n", sizeof(&p));——4或8

printf("%d\n", sizeof(&p+1));——4或8

printf("%d\n", sizeof(&p[0]+1));——4或8

printf("%d\n", strlen(p));——6

printf("%d\n", strlen(p+1));——5

 printf("%d\n", strlen(*p));——err

printf("%d\n", strlen(p[0]));——err

printf("%d\n", strlen(&p)); ——随机

printf("%d\n", strlen(&p+1));——随机

 printf("%d\n", strlen(&p[0]+1));——5

//二维数组

int a[3][4] = {0};

printf("%d\n",sizeof(a));——48

printf("%d\n",sizeof(a[0][0]));——4

printf("%d\n",sizeof(a[0]));——16

printf("%d\n",sizeof(a[0]+1));——4/8

printf("%d\n",sizeof(*(a[0]+1)));——4

 printf("%d\n",sizeof(a+1));——4/8

 printf("%d\n",sizeof(*(a+1)));——16

printf("%d\n",sizeof(&a[0]+1));——4/8

printf("%d\n",sizeof(*(&a[0]+1))); ——16

printf("%d\n",sizeof(*a));——16

printf("%d\n",sizeof(a[3]));——16

//a[3]是二维数组的第4行,虽然没有第四行,但是类型能够确定,大小就是确定的。大小就是一行的大小,单位是字节 - 16

// //能够分析出 a[3]的类型是:int [4]

总结:

数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。


目录
相关文章
|
监控 Java Docker
Spring Boot 整合 elk
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
2629 0
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
323 0
IDEA设置Tabs多行显示的方法
这篇文章介绍了在IntelliJ IDEA中设置多行显示Tabs的方法,包括如何取消单行展示Tabs并设置可展示的Tabs数量。
IDEA设置Tabs多行显示的方法
|
Java API 数据安全/隐私保护
获取HTTP请求参数的方法详解
获取HTTP请求参数的方法详解
|
数据采集 消息中间件 存储
Flume 快速入门【概述、安装、拦截器】
Apache Flume 是一个开源的数据采集工具,用于从各种数据源(如日志、网络数据、消息队列)收集大规模数据,并将其传输和加载到数据存储系统(如 HDFS、HBase、Hive)。Flume 由数据源(Source)、通道(Channel)、拦截器(Interceptor)和接收器(Sink)组成,支持灵活配置以适应不同的数据流处理需求。安装 Flume 包括解压软件包、配置环境变量和调整日志及内存设置。配置文件定义数据源、通道、拦截器和接收器,拦截器允许预处理数据。Flume 适用于构建数据管道,整合分散数据到中心存储系统,便于分析和报告。
2383 3
|
人工智能
AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
968 0
|
存储 Linux 开发工具
9.5 Linux读写执行权限(-r、-w、-x)的真正含义是什么?
通过前面的学习,我们知道了给文件设定权限的重要性,也知道了如何给文件设定权限。那么,读(r)、写(w)、执行(x)权限到底指的是什么呢?
1073 1
9.5 Linux读写执行权限(-r、-w、-x)的真正含义是什么?
|
缓存 编解码 Java
面试时常问的问题
面试时常问的问题
131 0
|
人工智能
离散数学_九章:关系(3)(一)
离散数学_九章:关系(3)(一)
412 0
|
运维
《2021云上架构与运维峰会演讲合集》电子版下载地址
《2021云上架构与运维峰会演讲合集》通过阿里云技术大咖分享云时代架构与研发运维趋势,任意门、大搜车、饿了么等优秀企业分享云上架构演进与运维最佳实践和圆桌论坛,资深技术从业人员共探行业发展前景等方面进行分析和探讨,将 2021 云上架构与运维峰会中的技术干货沉淀下来,以飨读者。
130 0
《2021云上架构与运维峰会演讲合集》电子版下载地址