首页 > 其他分享 >看过这个,你可能更了解指针3

看过这个,你可能更了解指针3

时间:2024-11-17 14:46:03浏览次数:1  
标签:arr 看过 元素 地址 了解 随机 数组 strlen 指针

我们来看下图

运算的结果会是什么呢?
接下来开始我们的分析。

****在1中

arr被单独放在strlen函数中,表示数组的首元素地址。
由于数组中没有\0,因此strlen在计算arr长度的时候并不会出现正常结果,
但是也不至于造成死循环。
因为在arr后的空间中往往会存在0等元素存放在地址中,
这里内存的0就相当于\0,会使strlen函数停下来。但我们并不知道\0与数组arr之间的“距离”,

所以第一题的结果会是一个随机值

****在2中

arr+0表示首元素的地址,在用法上与arr是一样的,
而且由于指向的都是首元素的地址,

所以连输出结果的随机值也是相等的
***在3中
arr表示首元素地址,
arr则表示第一个元素,即a。当a传入strlen时,
编译器识别时只认识其ASCII值,我们知道a的ASCII值为97,
这样97就被当做地址传入函数strlen中了。
在strlen的视角中,这97妥妥的是个非法地址,

因此就会报错。
如下图所示

****在4中
arr[1]表示第二个元素,即b,b的ASCII值为98
,传入函数strlen中后也是个非法地址,
同样会报错

****在5中

由于arr与&结合,这里的arr表示整个数组,&arr表示整个数组的地址。
strlen会从第一个元素开始数,知道遇到\0为止。
当然这里的结果也是随机值,

而已与1中的随机值是等大的

****在6中,
&arr+1表示跳过了一个数组大小后到达的位置,
即下图所示

当然我们也同样不知道\0的位置,因此这题的结果也同样是随机值。
但是如果在细节考究一点,我们知道6的答案是从&arr+1的位置开始数的。
arr数组的类型为char ,且元素个数为6,因此数组大小为6。

由此我们能知道这个随机值恰好等于1的随机值减去6个字节。

****在7中

&arr[0]表示首元素的地址,+1则表示跳过一个元素大小,arr中的数组类型为char,
因此跳过了一个char类型的大小,则跳到了arr[1]的地址。
无法得知\0的位置,这一题同样也是随机值,

而根据上一题的做法我们可以得知这一题的随机值等于1的随机值减去1

****最后,让我们剔除掉3和4这两个报错的再运行试试

可以看到这个除了3和4之外的都是可以运行的,
而这里运算出的随机值是42,说明从首元素开始经历了42个元素大小才找到\0。
而且第6题的答案为36,恰好是我们分析的42-6
第7题的答案是41,恰好是41-1
这说明我们的分析应该没有什么问题

标签:arr,看过,元素,地址,了解,随机,数组,strlen,指针
From: https://www.cnblogs.com/CxstaR/p/18550526

相关文章

  • 从零开始学机器学习——了解聚类
    首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns聚类是一种无监督学习方法,其基本假设是数据集未经过标记,或者输入数据与预定义的输出之间并不存在直接的对应关系。聚类的主要目标是将具有相似特征的数据点归类到同一组中,这一组通常被称为“簇”。聚类结果的......
  • CPP 智能指针
    CPP智能指针Created:2024-06-30T20:43+08:00Published:2024-11-16T23:17+08:00Categories:C-CPP智能指针的作用智能指针最初使的作用就是离开作用域调用析构函数。因为malloc出来的东西只能通过指针持有,栈上的对象在离开作用域后会自动调用析构函数,但是裸指针会不调......
  • 算法沉淀一:双指针
    目录前言:双指针介绍对撞指针快慢指针题目练习1.移动零2.复写零3.快乐数4.盛水最多的容器5.有效三角形的个数6.和为s的两个数7.三数之和8.四数之和前言:此章节介绍一些算法,主要从leetcode上的题来讲解,讲解内容为做题思路,附加代码。欢迎与我大家一起学习共同进......
  • 轻松理解操作系统 - Linux文件系统模块完结!又可以快速了解原理了
    在前面的7期中,我们了解了Linux文件系统的模块和它们相互之间是如何配合并形成一个完整的、可以将所有的所有都抽象成文件的体系。这样的体系主要是为了帮助大家在使用或编程的时候更加的简化,从而更简单的使用以及提升效率。本篇文章则提升深入理解Linux文件系统的效率,......
  • 一文带你了解防火墙的三种工作模式:路由模式、透明模式(网桥)、混合模式。网络安全零基础
    防火墙作为网络安全的核心设备之一,扮演着至关重要的角色。它不仅能够有效防御外部网络的攻击,还能保护内部网络的安全。在如今复杂多样的网络环境下,防火墙的部署和工作模式直接影响着网络安全策略的实施效果。防火墙通常可以工作在三种模式下:路由模式、透明模式(网桥模式)以及......
  • 序列化与反序列化-基本了解使用
    什么是序列化与反序列化        网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。这时,服务提供方就可以正确地从二进......
  • GC优化:栈内存、span、NativeMemory、指针、池化内存 笔记
    stackalloc使用栈内存,减少GC压力varwordMatchCounts=stackallocfloat[wordCount];SpanSpan支持reinterpret_cast的理念,即可以将Span强制转换为SpanSpan支持reinterpret_cast的理念,即可以将Span强制转换为Span(其中,Span中的索引0映射到Span的前四个字节......
  • [C++] 智能指针
    文章目录智能指针的使用原因及场景分析为什么需要智能指针?异常抛出导致的资源泄漏问题分析智能指针与RAIIC++常用智能指针使用智能指针优化代码优化后的代码优化点分析析构函数中的异常问题解决方法RAII和智能指针的设计思路详解什么是RAII?RAII的工作原理智能......
  • 26. 智能指针
    一、什么是智能指针  当我们使用new关键字为指针变量动态申请内存时,但是使用完毕之后,我们可能会忘记使用delete关键字手动回收内存。因此,C++中提供了智能指针。当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给智能指针对象,将无......
  • 深入了解内容分发网络(CDN)
    在当今的电商、直播、社交工具和视频网站等互联网应用中,存在着大量的图片、视频、文档等资源需要分发给用户。对于一些体量较大的应用而言,若将大量资源集中在单一节点进行分发,几乎没有哪个机房能够承受如此巨大的流量。例如,一个日活达100W的小型互联网产品,若每次请求需1M......