sizeof 和 strlen !!!

news2024/11/26 22:31:14

定义

sizeof()是单目操作符,是可以求变量(类型)所占空间的大小,不在乎内存中存放的是什么,只在乎内存大小

strlen()是函数,是计算字符串的长度的 它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

其括号内部是字符指针,无论放在这个括号里的任何东西都会被当成一个地址

 注:数组名是什么呢?

数组名通常来说是数组首元素的地址

但是有2个例外:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址

实战

指针 == 地址 == 内存编号 ,是地址就是 4 或 8 个字节

是地址在sizeof里面就是4或者8

char * p = "abcdef"  p是一个指针,存的是字符串首元素a的地址,但&p 是p的地址,并不是字符串首元素的地址,因此strlen(&p)是随机值 而 strlen(*p) 会报错

//int main()
//{
//	//int a[] = { 1,2,3,4 };
//
//printf("%d\n", sizeof(a));//4*4 = 16  计算整个数组大小
//printf("%d\n", sizeof(a + 0));//4/8 a+0是数组第一个元素的地址,是地址,大小就是4/8个字节
//	//printf("%d\n", sizeof(*a)); //4 a表示数组首元素的地址,*a表示数组的第一个元素,
//sizeof(*a)就是第一个元素的大小-4

//	//printf("%d\n", sizeof(a + 1));//4/8 a表示数组首元素的地址,
//a+1数组第二个元素的地址,sizeof(a+1)就是第二个元素的地址的大小 

//	//printf("%d\n", sizeof(a[1]));//4 计算的是第二个元素的大小
//	//printf("%d\n", sizeof(&a));//4/8 &a取出的是数组的地址,
//数组的地址也是地址呀,是地址大小就是4/8字节

//	//printf("%d\n", sizeof(*&a));//16 计算的整个数组的大小 
//	//printf("%d\n", sizeof(&a + 1));//4/8 - &a是数组的地址,
//+1跳过整个数组,产生的4后边位置的地址

//	//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' };//[a b c d e f]
// 这种方式存储字符串最后并没有加上'\0'

//	//printf("%d\n", strlen(arr));//随机值,
//arr数组中没有\0,所以strlen函数会继续往后找\0,统计\0之前出现的字符个数

//	//printf("%d\n", strlen(arr + 0));//随机值,arr+0还是数组首元素的地址
//	printf("%d\n", strlen(*arr));//err - arr是数组首元素的地址,
//*arr是数组的首元素,‘a’-97 字符在内存中存储时ASCII ,这个ASCII会被strlen当成地址,故报错

//	printf("%d\n", strlen(arr[1]));//err -'b' - 98 同上

//	//printf("%d\n", strlen(&arr));//随机值
//	//printf("%d\n", strlen(&arr + 1));//随机值
//	//printf("%d\n", strlen(&arr[0] + 1));//随机值
//
//
//	//printf("%llu\n", sizeof(arr));//6
//	//printf("%llu\n", sizeof(arr + 0));//4/8 arr + 0是数组首元素的地址
//	//printf("%llu\n", sizeof(*arr));//1 - *arr是首元素,首元素是一个字符,大小是一个字节
//	//printf("%llu\n", sizeof(arr[1]));//1 - arr[1]是数组的第二个元素,大小是1个字节
//	//printf("%llu\n", sizeof(&arr));//4/8 &arr是数组的地址
//	//printf("%llu\n", sizeof(&arr + 1));//4/8
// &arr + 1是从数组地址开始向后跳过了整个数组产生的一个地址

//	//printf("%llu\n", sizeof(&arr[0] + 1));//4/8 &arr[0] + 1 是数组第二个元素的地址
//
//	return 0;
//}
//int main()
//{
//	//char arr[] = { 'a', 'b', 'c','d', 'e', 'f' };
//
//	//char arr[] = "abcdef"; //这种存储方式存储了'\0'
//	[a b c d e f \0]

//	//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));//随机值 &arr是取出整个的字符串,+1跳过整个数组
//	//printf("%d\n", strlen(&arr[0] + 1));//5
//
//	//printf("%d\n", sizeof(arr));//7
//	//printf("%d\n", sizeof(arr + 0));//4/8 arr+0是数组首元素的地址
//	//printf("%d\n", sizeof(*arr));//1 - *arr 数组的首元素
//	//printf("%d\n", sizeof(arr[1]));//1 arr[1]数组的第二个元素
//	//printf("%d\n", sizeof(&arr));//4/8 - &arr数组的地址,但是数组的地址依然是地址,是地址大小就是4/8
//	//printf("%d\n", sizeof(&arr + 1));//4/8 - &arr + 1是\0后边的这个地址
//	//printf("%d\n", sizeof(&arr[0] + 1));//4/8 - &arr[0] + 1是数组第二个元素的地址
//
//	//char* p = "abcdef";
//
//	//printf("%d\n", strlen(p));//6
//	//printf("%d\n", strlen(p + 1));//5 从b的位置开始向后数字符
//	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  从b的位置开始向后数字符
//
//	//printf("%d\n", sizeof(p));//4/8  p是指针变量,计算的是指针变量的大小
//	//printf("%d\n", sizeof(p + 1));//4/8 p+1是'b'的地址
//	//printf("%d\n", sizeof(*p)); //1  - *p 其实就是'a'
//	//printf("%d\n", sizeof(p[0]));//1 - p[0]-> *(p+0)-> *p
//	//printf("%d\n", sizeof(&p));//4/8 &p 是指针变量p在内存中的地址
//	//printf("%d\n", sizeof(&p + 1));//4/8 - &p+1是跳过p之后的地址
//	//printf("%d\n", sizeof(&p[0] + 1));//4/8 &p[0]是‘a’的地址,&p[0]+1就是b的地址
//
//
//	//二维数组
//	int a[3][4] = { 0 };
//
//	printf("%d\n", sizeof(a));//计算的是整个数组的大小,单位是字节3*4*4 = 48
//	printf("%d\n", sizeof(a[0][0]));//4 第1行第一个元素的大小
//	printf("%d\n", sizeof(a[0]));//16 - a[0]是第一行的数组名,sizeof(a[0])就是第一行的数组名单独放在sizeof内部,计算的是第一行的大小
//	printf("%d\n", sizeof(a[0] + 1));//4/8 a[0]作为第一行的数组名,并没有单独放在sizeof内部,也没有被取地址
//	//所以a[0]就是数组首元素的地址,就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址
//
//	printf("%d\n", sizeof(*(a[0] + 1)));//4 - *(a[0] + 1))表示的是第一行第二个元素
//	printf("%d\n", sizeof(a + 1));//4/8 - a表示首元素的地址,a是二维数组,首元素的地址就是第一行的地址
//	//所以a表示的是二维数组第一行的地址,a+1就是第二行的地址
//	printf("%d\n", sizeof(*(a + 1)));//16 对第二行的地址解引用访问到就是第二行
//	//*(a+1) -> a[1]
//	//sizeof(a[1])
//	//
//	printf("%d\n", sizeof(&a[0] + 1));//4/8 - a[0]是第一行的数组名,&a[0]取出的就是第一行的地址
//	//&a[0] + 1 就是第二行的地址
//
//	printf("%d\n", sizeof(*(&a[0] + 1)));//16 - 对第二行的地址解引用访问到就是第二行
//	printf("%d\n", sizeof(*a));//16 - a就是首元素的地址,就是第一行的地址,*a就是第一行
//	//*a - > *(a+0) -> a[0]
//
//	printf("%d\n", sizeof(a[3]));//16 int [4]
//
//	//int a = 10;
//	//printf("%d\n", sizeof(a));//4
//	//printf("%d\n", sizeof(int));//4
//
//	return 0;
//}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程管道:pipe调用

在看过高级的popen函数之后&#xff0c;我们再来看看底层的pipe函数。通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令。它同时还提供了对读写数据的更多控制。pipe函数的原型如下所示&#xff1a; #include <unistd.h> int pipe(int pipefd[2])…

OS的事件机制-Event

Event在OSEK OS中&#xff0c;其实就是一个flag的作用&#xff0c;如果某个TASK执行了&#xff0c;就调用<SetEvent()>把flag就置起来&#xff0c;和这个task关联的另一个TASK也执行了&#xff0c;就可以把flag清掉<ClearEvent>&#xff0c;如果第一个TASK没有执行…

这才是你想了解的Redis

文章简介 redis作为一个基于内存的数据结构存储系统&#xff0c;由于它的灵活性和可拓展性强&#xff0c;在我们日常开发中经常被用作数据库、缓存或者消息代理。本文就从Redis的基本部署使用说到Redis的集群、锁和消息对列 Redis基本使用 一、安装 下载地址&#xff1a;htt…

mySql 储存过程 多个结果返回解析

当需要查询复杂的数据模型并返回多个结果集时&#xff0c;使用 MySQL 存储过程可以有效地优化性能。同时&#xff0c;在开发中使用 Mybatis 可以方便地调用 MySQL 存储过程并获取多个结果集。本文将介绍如何在 Mybatis 中调用 MySQL 存储过程&#xff0c;并获取多个结果集。 1、…

Java并发之原子类

一、原子类简介 1 什么是原子类 Java中提供了一些原子类&#xff0c;原子类包装了一个变量&#xff0c;并且提供了一系列对变量进行原子性操作的方法。原子性的意思是对于一组操作&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;不能只有其中某几个执…

基础知识学习---牛客网C++面试宝典(三)C/C++基础之面向对象

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

测试新手百科:Postman简介、安装、入门使用方法详细攻略!

本文关键词&#xff1a;Postman基础 目录 一、Postman背景介绍 二、Postman的操作环境 三、Postman下载安装 四、Postman的基础功能 五、接口请求流程 六、管理用例—Collections 七、身份验证Authentication 一、Postman背景介绍 用户在开发或者调试网络程序或者是网…

【答题】在线答卷-答题系统的微信小程序开发流程详解

用死记硬背的方法学习的学生&#xff0c;面对桌上堆积成厚厚的书本&#xff0c;是否感觉鸭梨山大呢&#xff0c;想着教育却面临着学习成本不小问题&#xff0c;是否感觉各种不便呢&#xff0c;如果对编程代码有感兴趣&#xff0c;不妨试试做一个自己的在线答题系统&#xff0c;…

有效性常见标志词

有效性常见标志词 混淆概念常见标志词 &#xff08; 1 &#xff09; 既然…那么… &#xff08; 2 &#xff09; 也就是说… &#xff08; 3 &#xff09; 很显然… &#xff08; 4 &#xff09; 因为A 就是B…所以… &#xff08; 5 &#xff09; 某主体A 是 &#xff0c;…

低代码01之构建项目框架

目录 低代码之构建框架11&#xff1a;项目初始化2&#xff1a;src / data.json 数据 &#xff08; 容器大小与渲染的表单数据 &#xff09;3&#xff1a;App.vue ( 导入editor组件传递data.json之中的数据与 向下提供组件配置数据config )4&#xff1a;src / packages / editor…

我记不住的那些C语言的二维数组的函数传参

背景&#xff1a; 最近在复习数据结构和算法&#xff0c;顺带刷刷题&#xff0c;虽然很长时间不刷题了但还是原来熟悉的味道&#xff0c;每一次重学都是加深了上一次的理解。本次我们看一下如何将C语言的二维数组进行函数传参&#xff0c;C语言实现。 其实这个比较简单&#x…

springboot项目使用proguard配置代码混淆

springboot项目使用proguard配置代码混淆 代码混淆是一些软件开发过程中必不可少的步骤。 常用的代码混淆技术有 proguard maven plugin , yguard maven plugin, procyon maven plugin, dex maven plugin . 这些代码混淆技术大同小异&#xff0c;都是对maven打包生成class时进…

补充知识点

这里写目录标题 进制转换Java内置的进制转换介绍具体代码 有符号数据表示法整数强制转换之数据溢出浮点数进制转换浮点数储存 进制转换 Java内置的进制转换 介绍 也就是常用API里Integer的静态方法 具体代码 注意 最后一个方法&#xff0c;返回的是基于第二个参数为基数的第…

大模型部署实战(三)——ChatGLM-6B

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SSR渲染-初识Nuxt-01

SSR服务端渲染 SSR服务端渲染&#xff1a;在后端将html页面处理好&#xff0c;前端直接展示&#xff08;可以解决为后端给你传了一个html脚本&#xff0c;全段渲染&#xff09; 为什么要有SSR服务端渲染&#xff1f; 可以解决单页面首屏加载慢的问题&#xff0c;同时有利于用…

在线分享怎么多接口批量查询快递信息

做物流和电商行业的小伙伴应该都知道&#xff0c;大量快递集中发出后&#xff0c;我们要做的就是及时查询和跟踪快递单号&#xff0c;这样能够有效避免快递发错或快递丢失等情况出现&#xff0c;小编今天给大家安利一款全自动批量查询跟踪快递单号的辅助工具&#xff0c;它支持…

【C++/嵌入式笔试面试八股】二、21.分层模型 | HTTP

分层模型 01.画出OSI和TCP/IP协议栈的对应关系 对应关系记忆2113 02.什么是OSI七层模型?每层列举2个协议。❤️ OSI七层模型及其包含的协议如下 物理层: 传输单位为bit 功能:通过物理媒介透明的传输比特流,确定机械及电气规范 主要包括的协议为:IEE802.3 CLOCK RJ45 数据链…

[学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 了解什么是 SVM 算法掌握 SVM 算法的原理知道 SVM 算法的损失函数知道 SVM 算法的核函数了解 SVM 算法在回归问题中的使用应用 SVM 算法实现手写数字识别器 1. SVM 算法简介 学习目标&#xff1a; 了解 …

路径规划算法:基于阿基米德优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于阿基米德优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于阿基米德优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用…

Spring Bean-生命周期

三连支持 一起鼓励 一起进步 Bean生命周期 文章目录 一、生命周期1.Bean中配置生命周期2.实现InitializingBean和DisposableBean接口3.PostConstruct & PreDestroy4.BeanPostProcessor接口 二、执行过程三、源码中使用的BeanPostProcessor1.以ApplicationContextAwareProce…