C语言-数组
C 语言支持数组数据结构,数组是一个由若干相同类型变量组成的有序集合。
这里的有序是指数组元素在内存中的存放方式是有序的,即所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
在 C 语言中,数组名表示数组的地址,即数组首元素的地址。当我们在声明和定义一个数组时,该数组名就代表着该数组的地址。数组中的元素可以通过索引访问,索引值从 0开始。C 语言还允许我们使用指针来处理数组,这使得对数组的操作更加灵活和高效。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
一、一维数组
1、定义
(1) 数组定义
基本格式为:dataType arrayName[length];
其中,dataType 为数据类型,arrayName 为数组名,length:为数组长度。
(2)访问数组元素
基本格式为:arrayName[index]
注意:
- 数组中每个元素的数据类型必须相同。
- 数组长度 length 最好是整数或者常量表达式,例如 10、20*4 等。
- 访问数组元素时,下标的取值范围为 0 <= index < length,过大或过小都会导致数组溢出越界异常。
(3)数组内存是连续的
数组是一个整体,它的内存位置是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。
连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。
一般情况下,数组名会转换为数组的地址,需要使用地址的地方,直接使用数组名即可。
2、初始化数组
一维数组的初始化,有 3种方式:
(1)定义数组时直接对数组元素赋初值。数组元素值一般放在一对大括号中。例如:
int iArray[6] = {1, 2, 3, 4, 5, 6};
(2)如果只给一部分数组元素赋值,则未赋值的元素默认为被赋值为类型默认值。例如:
int iArray[6] = {1, 2, 3}; // iArray[2] = 3, iArray[3] = 0
(3)当对全部数组元素都赋初值时,可以不指定数组长度。例如:
int iArray[] = {1, 2, 3, 4}; // 长度为4
数组长度可以使用 sizeof 运算符来获取数组的长度。
使用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,使用sizeof 也可以获得整个数组在内存中所占的字节数。因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度。
#include <stdio.h>int main() { int iArray1[6] = {1, 2, 3, 4, 5, 6};int iArray2[6] = {1, 2, 3};int iArray3[] = {1, 2, 3, 4};printf("iArray1长度:%d\n", sizeof(iArray1) / sizeof(iArray1[0]));printf("iArray2长度:%d\n", sizeof(iArray2) / sizeof(iArray2[0]));printf("iArray3长度:%d\n", sizeof(iArray3) / sizeof(iArray3[0]));return 0;
}
3、实例
实例1:
#include <stdio.h>int main() {int iArray[11] = {0};printf("请输入手机号:\n");for (int index = 0; index < 11; ++index) {scanf("%d", &iArray[index]); //输入号码使用空格隔开}printf("你输入手机号为:\n");for (int index = 0; index < 11; ++index) {printf("%d", iArray[index]);}return 0;
}
实例2:
#include <stdio.h>int main() { float fArray[5];for(int i = 0; i < 5; i++){fArray[i] = 1.1 * i;}for(int i = 0; i < 5; i++){printf("打印 fArray[%d]:%f \n", i, fArray[i]);}return 0;
}
二、二维数组
多维数组是由多个长度相同的一维数组构成的。主要认识二维数组。
基本格式如下:type name[size1][size2]…[sizeN];
1、定义
(1) 数组定义
基本格式为:dataType arrayName[length1][length2];
其中,dataType 为数据类型,arrayName 为数组名,length1 为行下标的长度,length2 为列下标的长度。
(2)访问数组元素
基本格式为:arrayName[index][index]
(3)数组内存是连续的
二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。那么,如何在线性内存中存放二维数组呢?
有两种方式:
- 一种是按行排列, 即放完一行之后再放入第二行;
- 一种是按列排列, 即放完一列之后再放入第二列。
在C语言中,二维数组是按行排列的。 也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4)=48 个字节。
2、初始化数组
二维数组的初始化,有 3种方式:
(1)将所有数据写在一个大括号内,按照数组元素排列顺序对元素赋值。例如:
int iArray[2][2] = {1, 2, 3, 4};
(2)为所有元素赋初值时,可以省略行下标,但是不能省略列下标。例如:
int iArray[][2] = {1, 2, 3, 4, 5, 6}; // 一共6个数据,分为3列,所以数组有2行。
(3)分行给数据元素赋值。例如:
int iArray[2][3] = {{1, 2, 3}, {4, 5, 6}};
数组长度可以使用 sizeof 运算符来获取数组的长度。
#include <stdio.h>int main() { int iArray1[2][2] = {1, 2, 3, 4};int iArray2[][2] = {1, 2, 3, 4, 5, 6};int iArray3[2][3] = {{1, 2, 3}, {4, 5, 6}};printf("iArray1长度:%d\n", sizeof(iArray1) / sizeof(iArray1[0][0]));printf("iArray2长度:%d\n", sizeof(iArray2) / sizeof(iArray2[0][0]));printf("iArray3长度:%d\n", sizeof(iArray3) / sizeof(iArray3[0][0]));return 0;
}
3、实例
一般使用嵌套循环来处理二维数组。
实例1:
#include <stdio.h>int main(){/* 5 行 2 列的数组 */int iArray[5][2] = {{10,15}, {1,2}, {2,4}, {3,6},{4,8}};int i, j;/* 输出数组中每个元素的值 */for (i = 0; i < 5; i++ ) {for (j = 0; j < 2; j++ ) {printf("打印 iArray[%d][%d] = %d\n", i, j, iArray[i][j]);}}return 0;
}
三、字符数组
数组中的元素类型为字符型时称为字符数组。即字符数据中的每个元素可以存放一个字符。
字符数组的定义和访问与其他数组类型类似。
C语言中没有专门的字符串变量,没有 String类型,通常使用字符数组来存放字符串。 字符数据实际上是一系列的字符集合,不严谨的说就相当于字符串。
1、定义
基本格式为:char arrayName[length];
其中,char 为字符类型,arrayName 为数组名,length:为数组长度。
2、初始化
字符数组的初始化,有 3种方式:
(1)逐个字符赋给数组中的元素。例如:
char cArray[6] = {'H', 'e', 'l', 'l', 'o'};
(2)定义字符数组的同时进行初始化,此时可以省略数组长度。例如:
char cArray[] = {'H', 'e', 'l', 'l', 'o'};
(3)利用字符串给字符数组赋初值。例如:
char cArray[] = {"Hello"}; // 也可以不指定数组长度
// 或者,去掉 {}
char cArray[] = "Hello";
字符串长度,就是字符串包含了多少个字符(不包括最后的结束符'\0')。
可以使用 string.h头文件中的 strlen() 函数来求字符串的长度。
#include <stdio.h>
#include <string.h>int main(){ char cArray1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};char cArray2[] = {'H', 'e', 'l', 'l', 'o'};char cArray31[5] = {"Hello"};char cArray32[] = {"Hello"};char cArray33[] = "Hello";printf("cArray1长度:%d\n", sizeof(cArray1) / sizeof(cArray1[0]));printf("cArray1 strlen长度:%d\n", strlen(cArray1));printf("cArray2长度:%d\n", sizeof(cArray2) / sizeof(cArray2[0]));printf("cArray2 strlen长度:%d\n", strlen(cArray2));printf("cArray31长度:%d\n", sizeof(cArray31) / sizeof(cArray31[0]));printf("cArray31 strlen长度:%d\n", strlen(cArray31));printf("cArray32长度:%d\n", sizeof(cArray32) / sizeof(cArray32[0]));printf("cArray32 strlen长度:%d\n", strlen(cArray32));printf("cArray33长度:%d\n", sizeof(cArray33) / sizeof(cArray33[0]));printf("cArray33 strlen长度:%d\n", strlen(cArray33));printf("--------------\n"); printf("cArray2:%s\n", cArray2);printf("cArray2[6]:%c\n", cArray2[6]);printf("cArray31:%s\n", cArray31);printf("cArray32:%s\n", cArray32);return 0;
}
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。
一般在字符串的最后手动添加’\0’或者初始化数组为’\0’或者数组大小多一个字节。
3、字符数组的结束标志
C语言中,使用字符数组保存字符串时,系统会自动为其添加“\0”作为结束符。
所以,在 C语言中,字符串总是以“\0”作为结尾,所以“\0”也被称为字符串结束标志,或者字符串结束符。
注意:
- “\0”是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在 C语言中唯一的作用就是作为字符串结束标志。
- C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到“\0”就认为到达了字符串的末尾,就结束处理。“\0”至关重要,没有“\0”就意味着永远也到达不了字符串的结尾。
- 用字符串方式初始化比逐个字符初始化要多占一个字节,多占的这个字节用于存放字符串结束标志“\0”。
// cArray1和cArray2是等价的,cArray1系统会自动添加“\0”。
char cArray1[] = "Hello";
char cArray2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
// 字符数组并不要求最后一个字符为“\0”,甚至可以不包含“\0”。所以下面的写法也是合法的。
char cArray3[5] = {'H', 'e', 'l', 'l', 'o'};
所以,是否加“\0”,应根据需要来决定,由于系统对字符串常量会自动加上一个“\0”。因此,为了使处理方法一直,并且便于测定字符串的实际长度,通常我们在字符数组中会人为的加上一个“\0”。
4、实例
实例1:
#include <stdio.h>int main() {char cString[7] = "charge";char cReverse[7] = {0};int size;size = sizeof(cString);printf("源字符串长度:%d\n", size);for (int i = 0; i < 6; ++i) {cReverse[size - i - 2] = cString[i];}printf("源字符串:%s\n", cString);printf("反转之后的字符串:%s\n", cReverse);return 0;
}
实例2:
#include <stdio.h>
#include <string.h>int main(){ char str[30] = {'\0'}; //将所有元素都初始化为 0,或者说 '\0'char c;int i;printf("str长度:%d\n", sizeof(str) / sizeof(str[0]));printf("str: strlen长度:%d\n", strlen(str));for(c=65,i=0; c<=90; c++,i++){str[i] = c;}printf("str:%s\n", str); printf("str: strlen长度:%d\n", strlen(str));return 0;
}
– 求知若饥,虚心若愚。
相关文章:

C语言-数组
C 语言支持数组数据结构,数组是一个由若干相同类型变量组成的有序集合。 这里的有序是指数组元素在内存中的存放方式是有序的,即所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。 在 C 语言中&am…...

Linux UWB Stack实现——MCPS调度接口(API)
在上一篇文章中,介绍了MCPS调度接口涉及的相关数据结构实现MCPS调度接口(数据结构),本文继续介绍调度相关的方法的实现。 1. 域处理 1.1 域注册与注销 注册/注销一个mcps802154_region,分别在模块加载(mo…...

el-tree中插入图标并且带提示信息
<template><div class"left"><!-- default-expanded-keys 默认展开 --><!-- expand-on-click-node 只有点击箭头才会展开树 --><el-tree :data"list" :props"defaultProps" node-click"handleNodeClick" :…...

竞赛选题 深度学习 YOLO 实现车牌识别算法
文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 该项目较…...

Direct3D网格(一)
创建网格 我们可以用D3DXCreateMeshFVF函数创建一个"空"网格对象 ,空网格对象是指我们指定了网格的面片总数和顶点总数,然后由该函数为顶点缓存、索引缓存和属性缓存分配大小合适的内存,之后即可手工填入网格数据。 HRESULT WINA…...

C语言打印菱形
一、运行结果图 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值;int line 0;int i 0;int j 0;//获取变量值;scanf("%d", &line);//循环打印上半部分;for (i 0; i <…...

ElasticSearch搜索引擎:数据的写入流程
一、ElasticSearch 写数据的总体流程: (1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node (2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该…...

python3 调用 另外一个python脚本
3种python调用其他脚本脚本的方法_python 调用python脚本_linjingyg的博客-CSDN博客 Python之系统交互(调用系统命令)subprocess_subprocess.getoutput(cmd) 参数格式不正确-CSDN博客 subprocess.call()只能返回状态码。subprocess.getoutput(cmd)只能输出命令结果。 str(py…...

【13】c++设计模式——>简单工厂模式
工厂模式的定义 c中的工厂模式是一种创建型设计模式,它提供一种创建对象的接口,但具体创建的对象类型可以在运行时决定,这样可以将对象的创建与使用代码分离,提高代码的灵活性和可维护性。 在c中实现工厂模式,通常会定…...

系统架构设计:2 论软件设计方法及其应用
目录 一 软件设计方法 1结构化设计 2信息工程 3面向对象设计 4原型设计...

基于Winform的UDP通信
1、文件结构 2、UdpReceiver.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace UDPTest.Udp {public class UdpStateEventArgs : EventArgs…...

掌握 BERT:自然语言处理 (NLP) 从初级到高级的综合指南(1)
简介 BERT(来自 Transformers 的双向编码器表示)是 Google 开发的革命性自然语言处理 (NLP) 模型。它改变了语言理解任务的格局,使机器能够理解语言的上下文和细微差别。在本文[1]中,我们将带您踏上从 BERT 基础知识到高级概念的旅…...

Linux Ftrace介绍
文章目录 一、简介二、内核函数调用跟踪参考链接: 一、简介 Ftrace 是 Linux 官方提供的跟踪工具,在 Linux 2.6.27 版本中引入。Ftrace 可在不引入任何前端工具的情况下使用,让其可以适合在任何系统环境中使用。 Ftrace 可用来快速排查以下相…...

Go语言进阶------>init()函数
Init()包初始化 执行优先级 Init()函数的执行优先级比main()函数的执行优先级要高,也就是说程序会优先执行Init()函数之后再执行main()函数. 代码如下 package mainimport "fmt"func init() {fmt.Println("执行了Init()函数") }func main() {fmt.Println…...

云计算:常用微服务框架
目录 一、理论 1.Java微服务框架 2.Go微服务框架 3.Python微服务框架 4.Node.js微服务框架 5..Net微服务框架 一、理论 1.Java微服务框架 Spring Cloud:最早最成熟,Java开源微服务框架方案 SpringBoot:全新框架,设计目的是…...

jmeter添加断言(详细图解)
先创建一个线程组,再创建一个http请求。 为了方便观察,我们添加两个监听器,察看结果树和断言结果。 添加断言:响应断言,响应断言也是比较常用的一个断言 设置响应断言:正常情况下响应代码是200。选择响应代…...

few shot object detection via feature reweight笔记
摘要部分 few shot很多用的都是faster R-CNN为基础,本文用的是one-stage 结构。 用了一个meta feature learner和reweighting模块。 和其他的few shot一样,先学习base数据集,再推广到novel数据集。 feature learner会从base数据集中提取meta…...

工会排队模式:电商新营销模式吸引消费者,提升销售!
随着电商行业的繁荣发展,私域流量已经成为了电商平台争夺消费者和促进销售的重要手段。工会排队模式正是在这种背景下应运而生的一种创新性的电商营销模式。这种模式通过奖金池的资金来为消费者和商家提供返现和排队奖励,构建了一个实现消费者和商家共赢…...

定档通知2024中国(北京)国际红外技术及设备展览会
时间:2024年7月14-16日 地点:北京国家会议中心 ◆展会背景background: 各有关红外企业厂商:2024年7月14~16日,2024中国国际红外技术及设…...

自助建站系统,一建建站系统api版,自动建站
安装推荐php7.2或7.2以下都行 可使用虚拟主机或者服务器进行搭建。 分站进入网站后台 域名/admin 初始账号123456qq.com密码123456 找到后台的网站设置 将主站域名及你在主站的通信secretId和通信secretKey填进去。 即可正常使用 通信secretId和通信secretKey在主站的【账号…...

算法框架-LLM-1-Prompt设计(一)
原文:算法框架-LLM-1-Prompt设计(一) - 知乎 目录 收起 1 prompt-engineering-for-developers 1.1 Prompt Engineering 1.1.1 提示原则 1. openai的环境 2. 两个基本原则 3. 示例 eg.1 eg.2 结构化输出 eg.3 模型检验 eg.4 提供示…...

一个rar压缩包如何分成三个?
一个rar压缩包体积太大了,想要将压缩包分为三个,该如何做到?其实很简单,方法就在我们经常使用的WinRAR当中。 我们先将压缩包内的文件解压出来,然后查看一下,然后打开WinRAR软件,找到文件&…...

批量获取拼多多商品详情数据,拼多多商品详情API接口
批量获取拼多多商品详情数据可以采用以下方式: 使用拼多多开放平台API接口。 拼多多开放平台提供了API接口,可以通过API接口获取拼多多平台上的商品信息,使用API接口需要进行权限申请和认证,操作较为复杂。 使用第三方工具。 市面…...

Redis Cluster Gossip Protocol: 目录
术语说明 server:当前的节点 cluster:每个节点的内存中都有一个集群信息结构,里面包含了集群中各个节点的状态信息(包括server自己) myself:当前节点在cluster中的实体 node:cluster节点字典中…...

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Span
作为Text组件的子组件,用于显示行内文本的组件。无子组件 一、接口 Span(value: string | Resource) 从API version 9开始,该接口支持在ArkTS卡片中使用。 参数: 参数名 参数类型 必填 参数描述 value string | Resource 是 文本内…...

这些负载均衡都解决哪些问题?服务、网关、NGINX
这篇文章解答一下群友的一系列提问: 在微服务项目中,有服务的负载均衡、网关的负载均衡、Nginx的负载均衡,这几个负载均衡分别用来解决什么问题呢? 在微服务项目中,服务的负载均衡、网关的负载均衡和Nginx的负载均衡都…...

Lambda表达式在C++中的定义
目录 背景介绍: Lambda表达式的定义: Lambda结构介绍: 1. Lambda capture 2. Lambda parameter list 3. Lambda mutable 4. Lambda return type 5. Lambda 主体 Lambda 表达式小结: Lambda 引用参考: 背景介…...

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验
课程1_第2周_测验题 目录:目录 第一题 1.神经元计算什么? A. 【 】神经元计算激活函数后,再计算线性函数(zWxb) B. 【 】神经元计算一个线性函数(zWxb),然后接一个激活函数…...

前端代码格式化规范总结
在日常开发过程中,经常会碰到代码格式化不一致的问题,还要就是 js 代码语法错误等没有及时发行改正,下面就介绍一下如何使用eslint、prettier、husky、lint-staged、commitizen来规范代码格式和提高代码质量的方法。 目录 准备工作代码检测代…...

Windows10打开应用总是会弹出提示窗口的解决方法
用户们在Windows10电脑中打开应用程序,遇到了总是会弹出提示窗口的烦人问题。这样的情况会干扰到用户的正常操作,给用户带来不好的操作体验,接下来小编给大家详细介绍关闭这个提示窗口的方法,让大家可以在Windows10电脑中舒心操作…...