【数组名】的各种使用方法,关于【数组名】的各种常见陷阱 -( 一 )

news2024/10/8 12:18:46

2024 - 10 - 05 - 笔记 - 22
作者(Author):郑龙浩 / 仟濹(网名)

【数组名】的各种使用方法,关于【数组名】的各种常见陷阱

1) 一维数组【int】int arr[] = {1, 2, 3, 4}

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

//在大多数情况下,arr表示的是首元素地址,但是在sizeof里面代表的是整个数组,所以打印的是整个数组的值大小,一个元素为4字节,所以4个元素的大小为4 * 4 == 16字节
printf("%d\n", sizeof(arr));//16 byte

//虽然说arr + 0 与 arr没有什么区别,但实际上arr + 0就不能表示整个数组了,而是表示的首元素的地址,arr + 0相当于 &arr[0] + 0 == &arr[0] == arr
printf("%d\n", sizeof(arr + 0));//4 byte / 8 byte(32位4字节,64位8字节)

//大部分情况下,只要sizeof中不是只有单独的arr,那么arr就是首元素地址,在这里arr为首元素地址,解引用就是首元素的值,即arr[0]
printf("%d\n", sizeof(*arr));//1 byte

//同上,arr为首元素地址,首元素地址加1为第二个元素的地址,只要是地址,就是 4 / 8 (32位 / 64位)
printf("%d\n", sizeof(arr + 1));//4 byte / 8 byte

//arr[1]为第二个元素的值,而这个元素的值为int型,int型的数据就是4个字节
printf("%d\n", sizeof(arr[ 1 ]));//4 byte


//这个稍微复杂一点
//1.&arr表示的是整个数组的地址
//2.还有一种解释相对复杂,&arr拿到的是整个数组的地址,那么类型就是int(*)[4],这是一种数组指针,但是指针所占的大小依然是固定的
//只要是地址,就是4 byte Or 8 byte
printf("%d\n", sizeof(&arr));//4 byte / 8 byte (32位 / 64位)


//这个也稍微复杂一点
//1.&arr表示的是整个数组的地址, 然后再解引用,就是表示的整个数组.可以理解为*&相互抵消了
//2.还有一种解释相对复杂,&arr拿到的是整个数组的地址,那么类型就是int(*)[4],这是一种数组指针,对数组指针解引用,得出来的就是【数组】
printf("%d\n", sizeof(*&arr));//16 byte


//同上,地址 + 1照样还是地址,只要是地址,就是4 byte Or 8 byte
printf("%d\n", sizeof(&arr + 1));//4 byte / 8 byte(32位 / 64位)

//&arr[0] 首元素的地址,首元素地址也是地址(4 byte / 8 byte),+1后仍然还是地址,所以还是 4 byte / 8 byte
printf("%d\n", sizeof(&arr[ 0 ] + 1));//4 byte / 8 byte(32位 / 64位)

2) 一维数组【char】char arr[] = {'a', 'b', 'c', 'd'};

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

sizeof


//在sizeof中,单写一个数组名,该数组名表示的就是整个数组,那么该数组的大小就是4  * 1 byte
printf("%d\n", sizeof(arr));//4 byte

//arr表示的首元素地址,地址的大小就是 4 byte / 8 byte
printf("%d\n", sizeof(arr + 0));//4 byte / 8 byte(32位 / 64位)

//arr表示的是首元素地址,解引用首元素地址 -> 元素的值 -> char的元素,占 1 byte
printf("%d\n", sizeof(*arr));//1 byte

//arr[1]为第2个元素值,该值的元素为char类型,所以占 1 byte
printf("%d\n", sizeof(arr[ 1 ]));//1 byte

//1.&arr表示的是整个数组的地址
//2.还有一种解释相对复杂,&arr拿到的是整个数组的地址,那么类型就是int(*)[4],这是一种数组指针,但是指针所占的大小依然是固定的
//只要是地址,一般就是 4 byte / 8 byte
printf("%d\n", sizeof(&arr));// 4 byte / 8 byte

//整个数组的地址 + 1,直接跳过整个数组,至于地址是什么地方就不知道了,可能直接变为了野指针,但是指针的大小依然不变
printf("%d\n", sizeof(&arr + 1));// 4 byte / 8 byte 

//&arr[0]为首元素的地址,首元素的地址 + 1 就是 &arr[1],只要是地址,依然是4 byte / 8 byte
printf("%d\n", sizeof(&arr[ 0 ] + 1 ));// 4 byte / 8 byte(32位 / 64位)

strlen - strlen是一个函数,用于计算并返回给定字符串的长度

从提供的地址开始,计算直至遇到字符串终止符‘\0’所在地址,确定字符串的实际长度。

//给的是数组的首地址,而strlen是从给的地址计算到'\0'所在地址的,然而该数组中可能并没有'\0',因为后面的数据是随机的,所以不知道指向第几个地址时才会有'\0',那么求的该数组字符串的大小就是随机的了
printf( "%d\n", strlen( arr ) );//随机值

//与上方的情况一样,依然是个随机值
printf( "%d\n", strlen( arr + 0 ) );//随机值

//这个就好玩了,arr是收元素的地址,*arr就是首元素的值,而在该数组中,首元素的值为'a',那么strlen(*arr) <==> strlen('a') <==> strlen( 97 );
//strlen中的参数是个地址,所以计算机会把97当做地址,而这种地址是未定义或者不可预知的,也就是平时所熟知的野指针了,对于这种野指针,在编译的时候,一般不会报错,但是在调试的时候,会有弹窗来报错提示的
printf( "%d\n", strlen( *arr ) );//程序错误 - 野指针

//与上方的情况是类似的,依然是报错
printf( "%d\n", strlen( arr[ 1 ] ) );//程序错误 - 野指针

//依然是随机值,和strlen(arr)情况相似,在strlen(arr)中,arr表示的是数组首元素的地址( 类型 - char* ),&arr表示的是整个数组的地址( 类型 - (char*)[4] ),这俩虽然类型不一样,但是strlen的参数类型设置的是 const char*,在传参过去的时候,也会强行将地址类型转换为char*,所以这俩所表示的地址还是一样的,都是首元素的地址,所以依然是随机值
//其实首元素的地址和整个数组的地址虽然类型不一样,但是在打印的时候,数值确还是一样的,所以不要太纠结
printf( "%d\n", strlen( &arr ) );//随机值

//&arr表示整个数组的地址,对&arr加1会跳过整个数组的内存区域,指向数组之后的内存,但这并不提供关于原数组长度的任何信息。对&arr加1后得到的地址与原数组无直接关联,它指向的是数组之后的内存区域。如果试图从这个地址开始“计算长度”,实际上依然是没有意义的。结果也就是随机值了。计算的时候不是从数组首地址开始计算的,而是从数组首地址开始算,第5个位置开始计算的,所以计算出来的大小就是原来的基础之上再减去4个(数组宽度)。
printf( "%d\n", strlen( &arr + 1 ) );//随机值 - 4

//首元素的地址 + 1 得出的是arr[1]的地址,即&arr[1],从这开始计算,比原来少计算了1个
printf( "%d\n", strlen( &arr[0] + 1 ) );//随机值 - 1

3) 指针指向常量字符串,int* p = “abcdef” - 数组有’\0’`

//在sizeof中,单写一个数组名,该数组名表示的就是整个数组,但是要注意p可不是数组名,他是一个char*类型的指针变量,指向的是字符串的第一个元素的地址,就是'a'的地址,那么打印出来肯定就是地址的大小了,即 4 byte / 8 byte (32位 / 64 位)
printf("%d\n", sizeof(p));//4 byte / 8 byte

//p指向常量字符串"abcdef"的首元素地址,地址的大小就是 4 byte / 8 byte
printf("%d\n", sizeof(p + 0));//4 byte / 8 byte(32位 / 64位)

//p指向常量字符串"abcdef"的首元素地址,解引用首元素地址 -> 元素的值 -> char的元素,占 1 byte
printf("%d\n", sizeof(*p));//1 byte

//p可以当数组名来用,p[1]为第2个元素值,该值的元素为char类型,所以占 1 byte
printf("%d\n", sizeof(arr[ 1 ]));//1 byte

//&p是指针变量的地址,只要是地址,大小就是 4 byte Or 8 byte
printf("%d\n", sizeof(&p));// 4 byte / 8 byte

//从p的地址跳过1个偏移量,依然还是地址
printf("%d\n", sizeof(&p + 1));// 4 byte / 8 byte 

//&p[0]为首元素的地址,首元素的地址 + 1 就是 &p[1],就相当于是'b'的地址,只要是地址,就是 4 byte / 8 byte
printf("%d\n", sizeof(&p[ 0 ] + 1 ));// 4 byte / 8 byte(32位 / 64位)

这次计算字符串长度就和上次不一样了,因为上次是没有‘\0’结尾,这次是有‘\0’结尾

//从'a'的地址开始计算到'f',宽度为6个
printf("%d\n", strlen(p));//6

//这里与上面一样的
printf("%d\n", strlen(p + 0));//6

//*p取出来是'a',也就是给了strlen一个地址为97
printf("%d\n", strlen(*p));//程序错误 - 野指针

//p[1]取出来是'b',也就是给了strlen一个地址为98,这不是一个有定义的自己或是可预知的地址
printf("%d\n", strlen(p[ 1 ]));//程序错误 - 野指针

//给strlen的是p的地址,而p是一个指针变量,这个定义的或者是可预知的,往后计算的时候,不知道何时会遇到'\0',那么计算出来就是随机值
printf("%d\n", strlen(&p));// 随机值

//给strlen的是p的地址 + 1 偏移量,而p是一个指针变量,这个定义的或者是可预知的,往后计算的时候,不知道何时会遇到'\0',那么计算出来就是随机值
printf("%d\n", strlen(&p + 1));//

//&p[ 0 ] + 1 等于是 &p[1],相当于'b'开始计算,计算到'f',得出5个
printf("%d\n", strlen(&p[ 0 ] + 1 ));// 5

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

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

相关文章

一款开源Ai语音合成TTS工具:Fish Speech

在人工智能和语音技术日新月异的今天&#xff0c;Fish Speech项目以其卓越的性能和广泛的应用前景&#xff0c;成为了开源语音合成领域的一颗璀璨新星。 该项目由Fish Audio团队倾力打造&#xff0c;旨在为研究者、开发者和普通用户提供一个高质量、易用且功能强大的语音合成解…

Docker13-图形工具Portainer

零、文章目录 Docker13-图形工具Portainer 1、图形化管理工具 Docker 的图形化管理工具可以帮助用户更直观地管理 Docker 容器、镜像、网络和数据卷等。 选择哪个工具取决于您的具体需求&#xff0c;比如是否需要支持远程管理、是否需要集成 Kubernetes、是否偏好桌面应用或…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中&#xff0c;很多场景中需要图形和详细信息的融合展示&#xff0c;那么在图表中可以新增普通列表与分组列表的配置。如下图所示&#xff1a; 配置说明 1、新增组件&#xff1a;配置入口如下图所示&#xff0c;新增组件时&#xff0c;选择普通列表与分…

电脑屏幕录屏怎么弄?4个方法教会你录制

电脑屏幕录屏怎么弄&#xff1f;电脑屏幕录屏是一项非常实用的技能&#xff0c;它在学习、工作和娱乐中扮演着不可或缺的角色。通过录屏&#xff0c;我们可以轻松记录并分享操作步骤、会议内容、游戏过程等&#xff0c;极大地丰富了我们的表达和沟通方式。同时&#xff0c;录屏…

mysql 慢查询日志、设置单条数据最大 packet 插入大小指令

检查是否开启慢查询日志 show variables like "%slow%";slow_query_log为 ON 表示已经开启慢查询日志记录。 slow_query_log_file&#xff1a;慢查询日志文件存放地址 设置慢查询 sql 记录阈值 大于 1s 的 sql 都会被记录到日志文件里面。系统默认 10s。mysql 重…

3、Redis Stack扩展功能

文章目录 一、了解Redis产品二、申请RedisCloud实例三、Redis Stack体验1、RedisStack有哪些扩展&#xff1f;2、Redis JSON1、Redis JSON是什么2、Redis JSON有什么用3、Redis JSON的优势 3、Search And Query1、传统Scan搜索2、Search And Query搜索 4、Bloom Filter1、布隆过…

【Python_PySide6学习笔记(三十八)】基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton

基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton 基于QPushButton实现自定义的圆形按键指示灯类tQCircularButton前言正文1、Qt样式表1.1 Qt样式表1.2 样式属性 2、设置Qt样式表3、tQCircularButton类4、使用示例 基于QPushButton实现自定义的圆形按键指示灯类tQ…

系统规划与管理——1信息系统综合知识(3)

文章目录 1.3 信息系统1.3.1 信息系统定义1.3.2 信息系统的生命周期1.3.3 信息系统常用的开发方法 1.3 信息系统 1.3.1 信息系统定义 信息系统是一种以处理信息为目的的专门的系统类型。信息系统可以是手工的&#xff0c;也可以是计算机化的。计算机化的信息系统的组成部件包…

【JVM调优】JVM高频参数和最优实践

JVM高频参数 一、常用参数配置1. 堆内存设置方式1&#xff08;Java8及之前&#xff09;方式2&#xff08;Java9及之后&#xff09; 2. 新生代和老年代设置3. 垃圾收集器选择4. 调试和日志5. Metaspace设置6. 其他重要参数 二、参数设置最佳实践三、GC日志参数设置日志解析Minor…

构建宠物咖啡馆:SpringBoot框架的实现策略

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

Vue入门-使用Vue2完成简单的记事本Demo

需求&#xff1a; ①能够实现记录重复数据 ②全部清空 ③单条记录清空 页面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

2024年开放式蓝牙耳机品牌排行榜前十名,五个超实用开放式耳机品牌分享

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

【生命之光再启航】开颅术后苏醒之谜:揭秘康复之旅的时间窗

在医学的浩瀚星空中&#xff0c;开颅手术无疑是一颗璀璨而又充满挑战的星辰。它以其高风险、高技术含量&#xff0c;成为治疗颅脑疾病不可或缺的重要手段。然而&#xff0c;对于患者及家属而言&#xff0c;手术虽已完成&#xff0c;但“做完开颅手术多久能醒&#xff1f;”这一…

Ollama本地部署自定义大模型

Ollama本地部署自定义大模型 1. Ollama安装2. 模型选择3. Ollama使用3.1 创建模型3.2 运行模型-命令行3.3 运行模型-接口 4. 其他有用命令参考链接 Ollama是一个专为本地机器设计的开源框架&#xff0c;旨在简化大型语言模型&#xff08;LLM&#xff09;的部署和运行过程。它提…

AWS EC2 部署Echarts大屏展示项目

前言 Echarts简介 ECharts是一个由JavaScript开发的开源可视化库。它能使数据生动、直观、互动、高度个性化数据可视化图表。ECharts适用大部分浏览器&#xff0c;如IE6 、Chrome、Firefox、Safari等&#xff0c;同时支持PC和移动设备。 开源&#xff1a;ECharts是一个开源项目…

大模型RAG:文档分块方案与RAG全流程

一 RAG与文本分块 1.1 为什么要文档分块 我们知道&#xff0c;大模型在预训练阶段获取的知识是有限的&#xff0c;一般需要数据增强模块引入外部知识库&#xff0c;通过知识检索的方式搜索于用户提问相关的知识&#xff0c;这也是RAG相关应用架构出现的原因。但这又引申出另一…

一个简单的将产品图册转换为翻页电子产品图册的方法

​在数字化浪潮席卷全球的今天&#xff0c;企业纷纷寻求转型&#xff0c;纸质产品图册逐渐被翻页电子图册所替代。电子图册不仅具有环保、便捷、易于更新等优势&#xff0c;还能为企业节省大量印刷和物流成本。那么&#xff0c;如何将现有的实体产品图册转化为翻页电子图册呢 1…

YOLO11改进|注意力机制篇|引入反向残差移动快iRMB

目录 一、【iRMB】注意力机制1.1【iRMB】注意力介绍1.2【iRMB】核心代码 二、添加【iRMB】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【iRMB】注意力机制 1.1【iRMB】注意力介绍 反向残差移动快iRMB结构如下所示&#xf…

「Ubuntu」根目录存储空间不足

Linux系统不同于 Windows系统&#xff0c;复杂的文件系统常常让人头疼&#xff0c;特别是动不动就存储空间不足&#xff0c;简单的清空回收站根本不管用&#xff0c;在此推荐一个绝对好用的方法&#xff0c;并且还可以多学习一条 Linux命令 1、du 使用方法 通过使用命令 du&am…