指针(7)

news2024/10/9 20:30:23

目录

1. sizeof和strlen的对⽐

1.1 sizeof

1.2 strlen

sizeof 和 strlen  总结:

 2. 数组和指针

2.1 ⼀维数组

2.2 字符数组


1. sizeof和strlen的对⽐

1.1 sizeof

计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof不在乎你里面放的什么。sizieof是操作符不是库函数

#include <stdio.h>
int main()
{
	int  a = 10;
	printf("%zd ", sizeof(a));
	printf("%zd ", sizeof( int) );
	int arr[10] = { 0 };
	printf("%zd ", sizeof(arr));

	return 0;
}

这个代码想必大家很熟悉了吧,前面讲到sizeof的时候有讲。如果的话可以回去看这个一篇继续更新 c语言 3-CSDN博客里面有讲到sizeof

1.2 strlen

strlen 是c语言中的库函数,不是操作符,不要把这个和sizeof混淆了。strlen针对的是字符串长度和字符数组,遇到  \0就会停止,统计  \0 之前的字符。

大家可以思考一下这个代码的运行结果是什么?

#include<stdio.h>
#include<string.h> 
int main()
{
	char  arr1[5] = "asdf";
	char  arr2[5] = { 'a','s','d','f' };
	printf("%zd ", sizeof(arr1));//5
	printf("%zd ", strlen(arr1));//4
	printf("%zd ", sizeof(arr2));//5
	printf("%zd ", strlen (arr2));//4
	return 0;
}

 公布结果! 

和我们后面注释的结果一直致,由上面运行结果就可以得出:

sizeof 和 strlen  总结:

sizeof

1. sizeof是操作符

2. sizeof计算操作数所占内存的 ⼤⼩,单位是字节

3. 不关注内存中存放什么数据

strlen

1. strlen是库函数,使⽤需要包含头⽂件 string.h

2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能 会越界

 2. 数组和指针

2.1 ⼀维数组

下面有些习题大家可以做一做,可以更深层的了解sizeof和strlen

#include <stdio.h>
int a[] = {1,2,3,4};
{
printf("%zd\n",sizeof(a));
printf("%zd\n",sizeof(a+0));
printf("%zd\n",sizeof(*a));
printf("%zd\n",sizeof(a+1));
printf("%zd\n",sizeof(a[1]));
printf("%zd\n",sizeof(&a));
printf("%zd\n",sizeof(*&a));
printf("%zd\n",sizeof(&a+1));
}

如果这里你大概掌握了strlen和sizeof的基本操作原理 那么上面的代码对你来说不是很难

结果如下: 

这里不懂4/8是什么意思的,可以参考我这篇笔记

#incldue <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%zd\n", sizeof(a));//这里的a是代表数组名的长度 16
	printf("%zd\n", sizeof(a + 0));//a 是数组名也就是首元素的地址这个a+0就是首元素的地址。4/ 8
	printf("%zd\n", sizeof(*a));//* a是首元素 取的也是内容所以就是4 字节
	printf("%zd\n", sizeof(a + 1));//a 是首元素地址,a+1是第二个元素地址 是地址就是 4/8
	printf("%zd\n", sizeof(a[1]));// a[1]是下标为1的元素 4
	printf("%zd\n", sizeof(&a));//这里的&a是整个数组的地址,然而是地址就是8个字节,地址不分贵贱
	printf("%zd\n", sizeof(*&a));//这里的 (*&a )是可以相互抵消的,sizeof(a)就是数组名的长度  16
	printf("%zd\n", sizeof(&a + 1)); //这个&a 是整个数组的地址,a+1就会跳过这个数组,然而是地址就是4/8
	printf("%d\n", sizeof(&a[0]));//这里的首元素的地址 是地址就是4/8
	printf("%d\n", sizeof(&a[0] + 1));//这个就是上面的基础上+1 就是第二个元素的地址,是地址就是 4/8
	return 0;
}

 大家可以自行复制代码研究一下

2.2 字符数组

话不多说直接上代码,大家可以算一算

#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

}

结果如下:

如果全做错,也不要气馁 ,没有人生来就是天才一学就会,我这次做也就对了几个。只要你肯努力总有一天,你会成为凤凰的。 我大学学的是机械与这个无关 ,但是我依然坚持学习。每天进步一点点就是我的座右铭了。

#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//这里字符是6个 注意这里是大括号不存在 \0
	printf("%d\n", sizeof(arr + 0));//这里是首元素的地址 4 /8
	printf("%d\n", sizeof(*arr));// 1 arr是首元素
	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));//首元素地址加1,就是第二个元素地址 4/8

	return 0;
}

下面继续看一看下面代码

首先strlen的特点是遇到\0 停止

#include <stdio.h>
inmt main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

}

当你做完后打开程序运行一下为什么只会打印两个答案呢?

这时候你可以调试一下找结果,发现了程序崩溃 那是为什么呢?

这里我把代码中的截图下来 当然不容易懂 我也会把代码再下面上传的

 当然我们把崩溃的代码注释掉,

这里的结果都是随机值

 

 

#include <stdio.h>
#include<string.h> 
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%zd\n", strlen(arr));//随机值
	printf("%zd\n", strlen(arr + 0));//随机值
	//printf("%zd\n", strlen(*arr));//arr首元素的地址,*arr是首元素内容 我们可以知道 a 是字符 ,转换为数字是ASALL码
	//a 是 97 这里的 97 当做地址程序直接会崩溃
	//printf("%zd\n", strlen(arr[1]));//与上面的原理一样 ,这里的arr [1] 是字符 'b ' 对应 98
	printf("%zd\n", strlen(&arr));//随机值 从首元素地址开始找 \0
	printf("%zd\n", strlen(&arr + 1));//随机值
	printf("%zd\n", strlen(&arr[0] + 1)); //随机值
	return 0;
}

下班 下次再续

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

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

相关文章

基于springboot人力资源管理系统源码

项目技术&#xff1a;SpringBoot 运行环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 项目描述&#xff1a; 系统包括&#xff0c;员工管理&#xff0c;奖惩管理&#xff0c;合同管理&#xff0c;薪酬管理&#xff0c;培训管理&#xff0c;绩效评估等功能

x++、++x的一些问题

x、x在字面上无非就说一个先前置递增然后再运算&#xff0c;另一个是运算完再递增&#xff0c;是不是有些许模棱两可的感觉&#xff0c;接下来引用一个简单的for循环就能够大致理解&#xff1a; 先是x&#xff1a; int i0,x0;for(i0;(i)<5;){xi;printf("%d\n",x)…

影刀RPA实战:Excel排序、替换与格式

1.实战目标 今天继续介绍影刀RPA操作Excel的指令&#xff0c;内容替换&#xff0c;数据排序与单元格格式设置&#xff0c;这几个功能在日常工作中使用率还是比较频繁的。我们可以使用影刀来处理这些重复繁琐的工作。 2.内容替换 我们手动替换内容时 打开Excel文件&#xff1…

【Spring】“请求“ 之后端传参重命名,传递数组、集合,@PathVariable,@RequestPart

1. 后端传参重命名&#xff08;后端参数映射&#xff09; 某些特殊情况下&#xff0c;前端传递的参数 key 和我们后端接收的 key 可以不一致&#xff0c;比如前端传了一个 time 给后端&#xff0c;而后端是使用 createtime 字段来接收的&#xff0c;这样就会出现参数接收不到的…

第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合

回溯算法理论基础 1.题目分类 2.理论基础 什么是回溯算法 回溯和递归是相辅相成的。 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 回溯法其实就是暴力查找&#xff0c;并不是什么高效的算法。 因为回溯的本质是穷举&#xff0c;穷举所有可…

销冠的至高艺术:让自己不像销售

若想在销售领域脱颖而出&#xff0c;首先是让自己超越传统销售的框架&#xff0c;成为客户心中不可多得的行业顾问与信赖源泉。这不仅是身份的蜕变&#xff0c;更是影响力与信任度质的飞跃。 销冠对客户只吸引不骚扰&#xff0c;不讲自己卖什么&#xff0c;只讲自己能解决什么…

销售秘籍:故事+观点+结论

在销售的浩瀚宇宙中&#xff0c;隐藏着一个不朽的秘诀——利用人类共有的“错失恐惧”&#xff0c;激发客户内心的渴望与行动。正如村上春树所言&#xff0c;每个故事都深深植根于灵魂&#xff0c;而大仲马则揭示&#xff0c;灵魂之眼所见&#xff0c;比肉眼更为长久铭记。 错…

【C++】入门基础介绍(下)输入输出,函数重载,缺省与引用

文章目录 7. C输入与输出8. 缺省参数9. 函数重载10. 引用10. 1 引用的概念10. 2 引用的特性10. 3 引用的使用10. 4 const引用10. 5 指针和引用的关系 11. inline12. nullptr 7. C输入与输出 iostream是 Input Output Stream 的缩写&#xff0c;是标准输入、输出流库&#xff0…

k8s 中存储之 PV 持久卷 与 PVC 持久卷申请

目录 1 PV 与 PVC 介绍 1.1 PersistentVolume&#xff08;持久卷&#xff0c;简称PV&#xff09; 1.2 PersistentVolumeClaim&#xff08;持久卷声明&#xff0c;简称PVC&#xff09; 1.3 使用了PV和PVC之后&#xff0c;工作可以得到进一步的细分&#xff1a; 2 持久卷实验配置…

什么是安全运营中心 SOC?

SOC 代表安全运营中心&#xff0c;它是任何企业中负责组织安全、保护企业免受网络风险的单一、集中的团队或职能。 安全运营中心将管理和控制业务运营的所有安全要素&#xff0c;从监控资产到雇用合适的人员和流程&#xff0c;再到检测和应对威胁。 在本文中&#xff0c;我们…

sqli-labs less-14post报错注入updatexml

post提交报错注入 闭合方式及注入点 利用hackbar进行注入&#xff0c;构造post语句 unameaaa"passwdbbb&SubmitSubmit 页面报错&#xff0c;根据分析&#xff0c;闭合方式". 确定列数 构造 unameaaa" or 11 # &passwdbbb&SubmitSubmit 确定存在注…

【Blender Python】7.一些运算、三角函数以及随机

概述 要用Blender进行程序生成&#xff0c;数学计算是少不了的&#xff0c;Python支持一些常规的表达式计算&#xff0c;而另外一些相关的数学函数则在math模块中。 一些基础的运算 取余、除法、整除 >>> 21 % 4 1>>> 21 / 4 5.25>>> 21 // 4 5…

视频画面提取保存为图片:简易方法与实用工具

如果需要在视频里随机截取某一帧作为照片来保存或分享&#xff0c;如何快速剪辑多个视频&#xff1f;幸运的是&#xff0c;如今有多种简易的方法和实用的工具可以帮助我们轻松实现这一目标。 1打开“媒体梦工厂”用到“视频封面”功能&#xff0c; 2在此功能里切换到“抽帧/提取…

通过实时可视性转变云安全

Upwind首席执行官 Amiram Shachar 讨论了混合和多云环境中云安全的复杂性。 他概述了深入了解配置和实时洞察的必要性&#xff0c;以实现敏捷性和安全性之间的平衡。 还分享了解决错误配置和确保合规性的策略&#xff0c;建议在云部署中采取主动的风险管理方法。 随着混合云…

毕设 大数据电影数据分析与可视化系统(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

Bluetooth Channel Sounding中关于CS Event Subevent的详细介绍

BLE CS Event & Subevent定义&#xff1a; BLE CS Event事件定义为&#xff1a;CS 事件被定义为从同一个 LE piconet 物理通道连接事件锚点具有相同偏移Offset的所有 CS Subevent子事件组&#xff0c;如图 1所示&#xff0c;具体参考Vol 1, Part A 3.3.2.5.2 Characteristi…

自动驾驶系统研发系列—如何选择适合自动驾驶的激光雷达?从基础到高端全解读

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

CSS圆角

在制作网页的过程中&#xff0c;有时我们可能需要实现圆角的效果&#xff0c;以前的做法是通过切图&#xff08;将设计稿切成便于制作成页面的图片&#xff09;&#xff0c;使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了&#xff0c;CSS3 中提供了一系列属性…

阿里云APP创建

首先进入阿里云生活物联网平台 阿里云生活物联网平台 创建新项目 然后创建新产品 完成后进入功能定义区 已经定义号插座电源开关&#xff0c;直接下一步 注意保留三元组信息 进入设备调试 没有模组&#xff0c;直接下一步 人机交互界面 最后测试 激活码&…

十大时间序列预测模型

目录 1. 自回归模型 原理 核心公式 推导过程: 完整案例 2. 移动平均模型 原理 核心公式 推导过程: 完整案例 3. 自回归移动平均模型 原理 核心公式 推导过程: 完整案例 4. 自回归积分移动平均模型 原理 核心公式 推导过程 完整案例 5. 季节性自回归积分…