【C语言基础】数组的高级应用(上)
文章目录
- 一、数组的概念
- 1.1 基本理解
- 1.2 从内存角度理解数组
- 1.3 从编译器角度理解数组
- 二、数组的定义
- 2.1 第一种:完全初始化
- 2.2 第二种:不完全初始化
- 三、访问数组的两种方式
- 3.1 第一种:数组的方式依次访问
- 3.2 第二种:指针的方式访问
- 四、测试类型占用内存
- 五、数组中几个关键符号
- 总结

一、数组的概念
1.1 基本理解
数据也是一种数据类型。是由数组成的一个组,数是一个特定数据类型的变量,组就是将这些数放在一起。就好比之前的散落在外面的家人回家团聚在一起,住在一个房子里,每个元素都有单独的房间。因为是“一家人”,所以所有数组元素的数据类型都是相同的。
1.2 从内存角度理解数组
(1)从内存角度讲,数组变量就是一次分配多个变量,而且这多个变量在内存中的存储单元是依次相连接的。
(2)分开定义多个变量(譬如int a, b, c, d;)和一次定义一个数组(int a[4]);这两种定义方法相同点是都定义了4个int型变量,而且这4个变量都是独立的单个使用的;不同点是单独定义时a、b、c、d在内存中的地址不一定相连,但是定义成数组后,数组中的4个元素地址肯定是依次相连的。
(3)数组中多个变量虽然必须单独访问,但是因为他们的地址彼此相连,因此很适合用指针来操作,因此数组和指针天生就叫纠结在一起。
1.3 从编译器角度理解数组
(1)从编译器角度来讲,数组变量也是变量,和普通变量、指针变量并没有本质不同。变量的本质就是一个地址,这个地址在编译器中决定具体数值,具体数值和变量名绑定,变量类型决定这个地址的延续长度。
(2)搞清楚变量、变量名、变量类型这三个概念的具体含义,很多问题都清楚了。
二、数组的定义
数组一共有三种定义方式,数组定于的过程就是初始化的过程。
2.1 第一种:完全初始化
数组完全初始化的标志:数组中的每个元素都是确定的。
数据类型 数组名 [数组元素个数]
例如:int a[3]={1,2,3}
或是:int a[]={1,2,3};//这样写[]里面的数字,也就是数组长度,计算机会根据后面的元素个数进行统计。
注意,写成int a[]是不对的,因为编译器无法推算出这种数组的长度。
因此,在定义数组同时初始化,则可以省略数组定义时[]的长度。
C语言编译器会自动推算出其长度,推论依据是初始化中元素的个数。
由此可知,省略[]中数组元素个数只有一种情况,那就是后面的初始化必须是完全初始化。
2.2 第二种:不完全初始化
例如:
int a[3]={1};//除了a[0]等于1,其余部分也就是a[1]和a[2]都默认为0。
int a[3]={};//数组中的元素全部都是0
int a[3];//数组中的元素全部都是0。

而int a[3]是无初始化,不同数据类型数组,包括:
整型数组:int a[3];
浮点型数组:float a[3];
双精度浮点型数组:double a[3];
字符数组:char a[3];
三、访问数组的两种方式
3.1 第一种:数组的方式依次访问
数组定义的时候作为整体定义。但是使用的时候不能作为整体使用,使用时必须拆开使用数组中的各个元素。
比如数组 int a [4],使用其中的4个元素,分别使用a[0]、a[1]、a[2]、a[3]。注意这里跟python一样,都是从0开始计算第一位的。其中[]是数组的标志,[]中的数字叫做数组下标,下标是我们访问数组中各个元素的指引。下标是0代表数据中的第一个元素,下标最后的一个是n-1访问时注意下标。
来个编程练习:
//打印字符数组:
int a[3] = {'a','b','r'};for (int i = 0; i < 3; i++){printf("a[%d]=%c\n",i,a[i]);}

int a[3] = {1,3,5};for (int i = 0; i < 3; i++){printf("a[%d]=%d\n",i,a[i]);}return 0;
这里注意字符输出是的格式化是用%c。如果使用%d,打印输出的是ASCII码(数字)。C语言中的字符型需要使用单引号。
3.2 第二种:指针的方式访问
以如下为例:


四、测试类型占用内存
int a = sizeof(int);
printf("a=%d",a);

五、数组中几个关键符号
以(a、a[0]、&a、&a[0])为例,进行分析与理解(前提是 int a[10])
(1)这4个符号搞清楚了,数组相关的很多问题都有答案了。理解这些符号的时候要和左值、右值结合起来,也就是搞清楚每个符号分别做左值和右值时的不同含义。
(2)a表示数组名。a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值;a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。一般讲元素地址就是指首地址。a做右值等同于&a[0];本质是指针。
(3)a[0]表示数组的首元素,也就是数组的第0个元素。做左值时表示数组第0个元素对应的内存空间(连续4字节);做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)
(4)&a表示数组名a取地址,字面意思来看就应该是数组的地址,因此是指针类型。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);&a做右值时表示整个数组的地址。
(5)&a[0]字面意思就是数组第0个元素的首地址(搞清楚[]和&的优先级,[]的优先级要高于&,所以a先和[]结合再取地址)。做左值时表示数组首元素对应的内存空间,做右值时表示数组首元素的值(也就是数组首元素对应的内存空间中存储的那个数值)。即:做右值时,&a[0]等同于a。
打印输出以检测对上述符号的理解是否正确:

解析:
第一个打印:由于输出的格式是整型,a作为右值表示首元素首地址,因此打印出的是地址,而非字符。
第二个打印:由于输出的格式是字符型,a[0]表示首元素,因此打印出的是字符,而非地址。
第三个打印:由于输出的格式是字符串型,a作为右值表示整个数组,因此打印输出的是字符串,而非地址。
reference:https://blog.csdn.net/Raven_csdn/article/details/87874679
其他需要注意的方法:[]可以贴着数组名,也可以不贴着,这都没关系。

总结
1、&a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的(首)地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。
2、a和&a[0]做右值时意义和数值完全相同,完全可以互相替代。但是sizeof(a)求的是整个数组的空间大小。sizeof(&a[0]),此时&a[0]指的是一个指针。
3、&a是常量,不能做左值。&a指的也是一个指针。
4、a做左值代表整个数组所有空间,然而,C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值。
数组类似于python中的集合。不同在于数据中的元素数据类型想要,而集合中的元素可以多样。
其次,两种的标志相同,都是[]。
C语言程序中,变量的实质就是内存中的一个格子,当我们定义(创建一个变量)了一个变量后,相当于在内存中得到一个格子,这个格子的名字就是变量名,以后访问这个内存格子就是使用该变量名就行了。这就是变量的本质。
数组的两种访问方式:1.下标式访问 2.指针式访问
数组下标只是表象,实际上编译器是将数组下标转换为指针式进行访问的。

相关文章:
【C语言基础】数组的高级应用(上)
文章目录 一、数组的概念1.1 基本理解1.2 从内存角度理解数组1.3 从编译器角度理解数组 二、数组的定义2.1 第一种:完全初始化2.2 第二种:不完全初始化 三、访问数组的两种方式3.1 第一种:数组的方式依次访问3.2 第二种:指针的方式…...
面试题:bind、call、apply 区别?如何实现一个 bind?
面试题:bind、call、apply 区别?如何实现一个 bind? 一、call()代码描述: 二、apply()代码描述: 三、bind()—最重要代码描述: 四、call、apply、bind 总结 一、call() 代码描述: 二、apply() 代码描述&am…...
【SpringBoot学习笔记】01.第一个程序HelloWorld
项目创建方式:使用 IDEA 直接创建项目 1、创建一个新项目 2、选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现 3、填写项目信息 4、选择初始化的组件(初学勾选 Web 即可) 5、填写项目路径 6、等待项目…...
【学会动态规划】买卖股票的最佳时机含手续费(16)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
网络原因导致git下载报错处理办法
如下,git clone时报错: RPC failed; curl 18 transfer closed with outstanding read data remaining 5670 bytes of body are still expected fetch-pack: unexpected disconnect while reading sideband packet early EOF fetch-pack: invalid index…...
APP后端选择什么服务器
对于很多刚入行的朋友来说,不清楚应该选择什么样的服务器提供商,是选择传统的IDC, 租用服务器租用机柜,还是选择现在很火的云服务器呢?在本文中,通过对比传统的IDC和云服务,简单阐述一下服务器的选择。 …...
什么是反射机制,反射机制的应用场景
文章目录 反射机制介绍获取 Class 对象的四种方式代码实例静态编译和动态编译反射机制优缺点反射的应用场景 反射机制介绍 JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能…...
Visual Studio 2019 实用功能设置(背景颜色,代码字体及行号设置)
前言 Visual Studio 2019 安装包的下载教程、安装教程 教程 博主博客链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 系列文章 第一篇:Visual Studio 2019 详细安装教程(图文版) 第二篇&…...
简述Mysql索引
一、索引概述 1.1 索引概述 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。 这些数据结…...
windows .gitignore 加入文件名后 依然可以从git status中看到文件问题
最近在学git,对着b站的视频操作,结果很简单的添加.gitignore文件操作,up主的正常隐藏,我的却一直出问题。 百思不得其解,网上各种啥啥啥清缓存都没讲到点上。 最后发现是.gitignore文件有问题,windows默认…...
召唤神龙打造自己的ChatGPT
在之前的两篇文章中,我介绍了GPT 1和2的模型,并分别用Tensorflow和Pytorch来实现了模型的训练。具体可以见以下文章链接: 1. 基于Tensorflow来重现GPT v1模型_gzroy的博客-CSDN博客 2. 花费7元训练自己的GPT 2模型_gzroy的博客-CSDN博客 有…...
裝修公司同室內設計公司有咩分別?
很多裝修業主都會有裝修公司師傅會不會「出圖」的這個疑問。 出圖是指室內設計的各種圖,是設計師跟戶主和裝修師傅溝通裝修的工具,亦都係施工、驗收的證明。通常齊全的圖通常只有設計公司才可以完整提供例如平面圖、3D效果圖等等。 由於室內設計公司會…...
android oaid
Oaid获取接入流程 移动智能设备标识公共服务平台 AndroidID、IMEI、OAID获取 oaid_sdk_1.1.0的aar 随着Google对隐私的重视以及Android10的逐渐普及,获取设备的唯一标识越来越来难,在Android10以前,Android设备唯一标识包含IMEI、AndroidID、…...
利用XSS在线平台获取用户cookie
//XSS弹窗: <script>alert("xss")</script> XSS漏洞: //XSS弹窗: <script>alert("xss")</script> //XSS在线平台: <ScRipT sRc//7ix7kigpovxdbtd32fuspgffmtmufo3wwzgnzaltddewtb…...
rsync 命令以及脚本使用
rsync是什么? rsync 是一个远程同步工具 下载 你的集群每一台都需要下载!(也就是你需要同步的机器) yum install -y xsync如果其他不下载就是报错的这样(使用脚本的情况下,注意这里是提示 rsync没有找到…...
【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差
序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动,平动,转动4【数理知识】向量数乘,内积,外积,matlab代码实现5【数理知识】协…...
WebDAV之π-Disk派盘+可达漫画
可达漫画这是一款专为阅读你的漫画收藏而设计的阅读器。 热爱漫画的你肯定收藏了不少各种类型的漫画,它们可能有各种各样的格式,zip,rar,cbz,cbr,epub, mobi 或 pdf,也可能只是单纯的文件夹。 可达漫画支持「流式阅读」,如果你的服务器使用 WebDAV 或 SMB 协议,那么…...
Spring中Bean的线程安全问题
Spring框架本身没有明确指出Bean的线程安全问题,所以Bean本身也不具备线程安全的特性,具体情况得看scope的情况。 1.原型的(prototype) 每次创建一个新的对象,每个线程使用的对象都是要新创建的,所以不会存在线程安全的问题。 2…...
Java spring boot 全解Camunda 7,从 0 到 1 构建工作流平台——第二节:Spring boot 简单集成
目录 1. 成果展示2. 环境准备3. 项目构建3.1 项目结构3.2 引入Camunda 依赖3.3 启动spring boot 程序3.4 启动 web app 程序 引言:当今技术发展迅猛,企业对于业务流程的高效管理和自动化需求也日益增长。在这个背景下,Spring Boot和Camunda7成…...
手持式静电测试仪的运用原理
手持式静电测试仪(Handheld Electrostatic Test Meter)是一种用于测量和检测静电电荷的便携式设备。它通常用于工业生产、实验室研究、防静电控制和监测等领域。 手持式静电测试仪可以帮助用户快速准确地测量物体表面静电电荷的状态,从而评估…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
