【C语言】数组

一、数组的定义

1.1 什么是数组?

数组是一种数据结构,它可以存储多个相同类型的元素。

 1.2 数组的定义

一般形式:数据类型 数组名[数组长度]

•int grades[100];//定义了一个名为gardes的整数数组,该数组可以存储100个整数。

•元素数量必须是整数

C99之前:元素数量必须是编译时刻确定的字面量,也就是不能使用变量或表达式来指定数组的大小。这意味着在声明数组时,必须使用一个明确的常量来表示数组的大小。

例如,下面的代码是不被允许的:

int size = 10;
int arr[size]; // 编译错误,不能使用变量来指定数组大小

C99之后:C99引入了可变数组(VLA),允许使用变量来指定数组的大小。这在某些情况下非常方便,特别是当你需要在运行时根据条件来确定数组的大小时。

1.3 数组的初始化

C语言中,对数组进行初始化有多种方式。下面会一一列举:

1.逐个初始化。

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

2.使用初始化列表。

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

3.使用部分初始化列表,剩下的元素会自动初始化为0。

int arr[5]={1,2,3};//arr[5]={1,2,3,0,0}

4.使用循环初始化

int arr[5];
for (int i = 0; i < 5; i++) {arr[i] = i + 1;
}

二、数组的应用

2.1 数组分类

一维数组:数组是由相同类型的元素组成的有序集合,可以包含任意数量的元素。一维数组是最简单的数组形式,所有元素都排列在同一个线性序列中。

int numbers[5];

多维数组:除了一维数组,C语言还支持多维数组。多维数组是由多个一维数组组成的数据结构,可以是二维、三维或更高维度的数组。

int a[3][2][6];//三维数组

静态数组:静态数组在声明时就给定了固定的大小,无法在运行时改变数组的大小。

int numbers[5];

动态数组:动态数组是在运行时使用malloc或calloc等函数动态分配内存空间的数组,可以根据需要改变数组的大小。

    printf("请输入数组大小:");scanf("%d", &size);arr = (int*)malloc(size * sizeof(int));// 使用malloc函数动态分配内存for (int i = 0; i < size; i++) {scanf("%d", &arr[i]);}

2.2 访问数组

数组元素的访问:数组中的元素可以通过索引来访问,索引从0开始,依次递增。例如,数组arr的第一个元素可以通过arr[0]访问,第二个元素可以通过arr[1]访问,以此类推。

	int a[5] = { 1,2,3,4,5 };printf("%d", a[0]);//输出1printf("%d", a[1]);//输出2printf("%d", a[2]);//输出3printf("%d", a[3]);//输出4printf("%d", a[4]);//输出5

数组名的特殊性:在C语言中,数组名本身实际上是一个指向数组第一个元素的指针,可以通过数组名来访问数组的元素。arr==&arr[0]。

	int a[5] = { 1,2,3,4,5 };scanf_s("%d", a);printf("%d", a[0]);//输入XX,就输出XX

数组不要越界访问:C语言中的数组是没有边界检查的,如果访问超出数组范围的元素,可能会访问到非法内存区域,导致程序崩溃或产生不可预期的结果。

int arr[5] = {1, 2, 3, 4, 5};
int x = arr[6]; // 越界访问

2.3 数组作为函数参数(int a[]==int *a)

数组作为函数参数:在函数中,可以将数组作为参数传递给函数。

函数参数int a[]和int *a传递的东西是一样的。在函数调用时,数组名a会被自动转换为指向数组第一个元素的指针。因此,无论是使用int a[]还是int *a作为函数参数,在函数内部都可以通过指针操作来访问或修改数组的元素。

#include<stdio.h>void f(int *a, int L);//指针作为函数参数int main() {int a[5] = {1,2,3,4,5};f(a, sizeof(a) / sizeof(int));printf("%d", a[0]);//输出99,成功修改a[0]return 0;
}void f(int *a, int L) {a[0] = 99;
}
#include<stdio.h>void f(int a[], int L);//数组作为函数参数int main() {int a[5] = {1,2,3,4,5};f(a, sizeof(a) / sizeof(int));printf("%d", a[0]);//输出99,成功修改a[0]return 0;
}void f(int a[], int L) {a[0] = 99;
}

 2.4 数组长度(sizeof)

数组的长度:数组的长度可以通过sizeof运算符来获取。

例如:sizeof(arr)返回数组arr的总字节数。

	int arr[5] = { 1,2,3,4,5 };printf("%zu", sizeof(arr));//输出20

sizeof(arr[0])返回数组元素的字节数。

	int arr[5] = { 1,2,3,4,5 };printf("%zu", sizeof(arr[0]));//输出4

sizeof(arr)/sizeof(arr[0])返回数组元素个数。

	int arr[5] = { 1,2,3,4,5 };printf("%zu", sizeof(arr)/sizeof(arr[0]));//输出5

三、字符串与数组的关系

在C语言中,字符串可以被视为字符数组。另有文章讲解:

四、可变数组

 (未完待续)

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

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

相关文章

51 单片机入门 400 例

1 IO输出 点亮1个LED灯方法1 2 IO输出 点亮1个LED灯方法2 3 IO输出 点亮多个LED灯方法1 4 IO输出 点亮多个LED灯方法2 5 闪烁1个LED 6 不同频率闪烁1个LED灯 7 不同频率闪烁多个LED灯…

前端图片转base64 方法

前端可以使用FileReader对象的readAsDataURL方法将图片文件转换为base64编码。 示例代码如下&#xff1a; // 获取文件对象 var fileInput document.getElementById(fileInput); var file fileInput.files[0];// 实例化FileReader对象 var reader new FileReader();// 读取…

汇编语言程序设计(二)十六位汇编框架、子程序与堆栈

寄存器 如下是16位通用寄存器&#xff0c;存储在cpu硬件中 AX 返回值 AX寄存器分为两部分 AH和AL AH 高8位 存储功能号 AL 低8位 存储返回码 以下是一个AX寄存器应用&#xff1a; mov ax,4c00h 4c给高位AL&#xff0c;00低位AL&#xff0c;16进制要以h结尾 BX CX 计数…

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…

springboot174基于springboot的疾病防控综合系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

vscode wsl远程连接 权限问题

问题描述&#xff1a;执行命令时遇到Operation not permitted 和 Permission denied问题&#xff0c;是有关ip地址和创建文件的权限问题&#xff0c;参考网络上更改wsl.conf文件等方法均无法解决&#xff0c;只能加sudo来解决

【MySQL进阶之路】磁盘随机读写和顺序读写对MySQL性能的影响

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

前后端通讯:前端调用后端接口的五种方式,优劣势和场景

Hi&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…

解析十六进制雷达数据格式:解析雷达数据长度。

以Cat62格式雷达数据为例&#xff0c;十六进制雷达数据部分代码&#xff1a; 3e0120bf7da4ffee0085 雷达数据长度使用4个字符&#xff08;2个字节&#xff09;标识&#xff0c;在这里是“0120”&#xff0c;转换为十进制数为288。 雷达数据长度父类&#xff1a; base_length_…

【心得】关于STM32中RTC的校准方法

最近看了一些关于RTC校准的帖子&#xff0c;发现很多人存在疑惑。正好最近我也在STM32中实现了RTC校准。发些心得。这些对老手来说有些罗索&#xff0c;但对新手有益处。 实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t Calibra…

python 基础知识点(蓝桥杯python科目个人复习计划35)

今日复习计划&#xff1a;阶段总结&#xff08;新年贺礼&#xff09; 1.python简介&#xff08;定义&#xff0c;优点&#xff0c;缺点&#xff0c;应用领域&#xff09; python&#xff1a;一种广泛使用的解释型&#xff0c;高级和通用的编程语言 python极简&#xff0c;生…

2.1 Binance_interface APP 现货交易账户

Binance_interface APP 现货交易账户 Github地址PyTed量化交易研究院 目录 Binance_interface APP 现货交易账户1 APP 现货交易账户函数总览2. 模型实例化3. 获取账户信息 get_account4. 获取单个现货余额 get_balance5. 获取全部现货余额&#xff08;列表格式&#xff09; ge…

Xray 工具笔记

Xray 官方文档 扫描单个url&#xff08;非爬虫&#xff09; 并输出文件&#xff08;不同文件类型&#xff09; .\xray.exe webscan --url 10.0.0.6:8080 --text-output result.txt --json-output result.json --html-output report.html默认启动所以内置插件 &#xff0c;指定…

LLVM实战之将LLVM bitcode转回为LLVM汇编码

目录 1. 详细步骤 2. 原理 本文将介绍如何通过反汇编工具llvm-dis把LLVM bitcode转回为LLVM IR。 前提是已经安装llvm-dis工具(在LLVM工具链中)。 1. 详细步骤 为了验证将bitcode文件转成IR的正确性,这里将使用前面(链接)文章中的test.bc文件作为输入。执行如下步骤: …

「优选算法刷题」:点名

一、题目 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 示例 1: 输入: records [0,1,2,3,5] 输出: 4示例 2: 输入: records [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7 提示&#xff1a; 1 < records…

前端JavaScript篇之实现call、apply 及 bind 函数

目录 实现call、apply 及 bind 函数1. 实现call函数2. 实现apply函数3. 实现bind函数 实现call、apply 及 bind 函数 call、apply和bind函数都是用于改变函数中this指向的方法。它们的作用都是使函数能够在不同的对象上下文中运行。call方法和apply方法的作用类似&#xff0c;…

多元回归分析:理论与应用

多元回归分析是一种统计方法&#xff0c;用于研究两个或多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关系。这种分析允许研究者评估多个因素对结果变量的影响&#xff0c;是社会科学、经济学、生物医学和工程等多个领域中常…

【doghead】uv_loop_t的创建及线程执行

worker测试程序,类似mediasoup对uv的使用,是one loop per thread 。创建一个UVLoop 就可以创建一个uv_loop_t Transport 创建一个: 试验配置创建一个: UvLoop 封装了libuv的uv_loop_t ,作为共享指针提供 对uv_loop_t 创建并初始化

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Toggle组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Toggle组件 组件提供勾选框样式、状态按钮样式及开关样式。 子组件 仅当Toggl…

【MySQL】数据库基础 -- 详解

一、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能&#xff0c;但是文件并没有提供非常好的数据&#xff08;内容&#xff09;的管理能力&#xff08;用户角度&#xff09;。 文件保存数据有以下几个缺点&…