C语言学习笔记---数组篇章

C语言程序设计笔记---011

  • C语言数组
    • 1、一维数组的创建和初识化
    • 2、数组的初识化
    • 3、一维数组的使用
      • 3.1、一维数组在内存中的存储
    • 4、二维数组的创建和初识化
      • 4.1、二维数组的使用
        • 4.1.1、打印二维数组的元素例程
      • 4.2、二维数组在内存中的存储
      • 4.3、数组越界
        • 4.3.1、数组越界例程
      • 4.4、数组作为函数的参数
        • 4.4.1、数组名是什么?
    • 5、结语

C语言数组

/知识点汇总/

1、一维数组的创建和初识化

概念
数组就是一组相同类型元素的集合,或者说表示类型相同的数据

数组的创建方式

type_t arr_name[const_n];
//type_t ---- 数组的元素类型
//arr_name ---- 数组名
//const_t --- 常量表达式,指定数组的大小

举例说明数组的创建

#include <stdio.h>
int main()
{int arr[5];int arr2[2 + 3];char arr3[8];//C99之前数组只能是常量来指定大小//C99之后引用了变长数组的概念,数组的大小就可以使用变量来指定了//但是C99标准下,数组的大小可以使用变量指定,但是数组不能初识化//但是Vs2022/Vs2019 不支持C99的变长数组int n = 0;scanf("%d",&n);int arr4[n];return 0;
}

2、数组的初识化

概念
数组的初识化是指,在创建数组的同时给数组的内容一些合理初始值(初识化)

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3 };//不完全初识化,剩余元素默认补0int arr2[4] = { 1,2,3,4 };//完全初始化char arr4[3] = { 'a',98,'c' };int arr3[] = {1,2,3};//省略数组大小, 由编译器自行判断数组内的元素char arr7[] = {'a','b','c'};//'/0'字符串结束标志char arr8[] = "abc";return 0;
}

3、一维数组的使用

[] —> 下标引用符

#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n",arr[5]);//6//通过[]下标引用操作符,打印数组元素int i = 0;//for (i = 0; i < 10; i++)//{//	printf("%d\n",arr[i]);//}//计算数组元素个数int sz = sizeof(arr) / sizeof(arr[0]);//更改元素for (i = 0; i < sz; i++){arr[i] = 10 - i;}for (i = 0; i < sz; i++){printf("%d\n", arr[i]);}return 0;
}

3.1、一维数组在内存中的存储

观察存储情况

#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//通过[]下标引用操作符,打印数组元素int i = 0;//计算数组元素个数int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("&arr[%d] = %p\n",i,&arr[i]);//&arr[0] = 0019F908//&arr[1] = 0019F90C//&arr[2] = 0019F910//&arr[3] = 0019F914//&arr[4] = 0019F918//&arr[5] = 0019F91C//&arr[6] = 0019F920//&arr[7] = 0019F924//&arr[8] = 0019F928//&arr[9] = 0019F92C//观察结果可知,相邻元素之间相差4,单位字节}return 0;
}

小结:
(1)、数组在内存中是连续存放的
(2)、随着下标的增长,地址是由低到高变化的

4、二维数组的创建和初识化

[ ][ ] – 几行几列

#include <stdio.h>
int main()
{int arr[3][5];//整型二维数组创建char arr2[4][10];//字符型二维数组创建int arr3[2][3] = {0};//char arr4[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};char arr4[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };//大括号的作用约束,元素是否按照顺序放满之后再存放下一行int arr5[4][10] = { {1,2},{2,3,4},{5,5,5} };//注意:行可省略,列不可以省略//因为列确定一行所放的元素,行根据初识化几行就放几行int arr6[][3] = {1,2,3,4,5,6,7,8,9};//3行3列return 0;
}

小结
(1)、对于二维数组,如果初识化了,对于行数是可以省略的,但列是不能省略的
(2)、大括号的作用约束,元素是否按照顺序放满之后再存放下一行

4.1、二维数组的使用

二维数组的访问依然是通过下标进行访问

4.1.1、打印二维数组的元素例程

#include <stdio.h>
int main()
{int arr[3][5] = { {1,2},{4,5},{6,7,8} };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ",arr[i][j]); }printf("\n");}return 0;
}
#include <stdio.h>
int main()
{int arr[3][5] = { {1,2},{4,5},{6,7,8} };int i = 0;//数组元素1~15for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){arr[i][j] = i * 5 + j + 1;}}//打印1~15数组元素for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

4.2、二维数组在内存中的存储

#include <stdio.h>
int main()
{int arr[3][5] = { {1,2},{4,5},{6,7,8} };int i = 0;//打印数组元素for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n",i,j, &arr[i][j]);//&arr[0][0] = 00AFFC00//&arr[0][1] = 00AFFC04//&arr[0][2] = 00AFFC08//&arr[0][3] = 00AFFC0C//&arr[0][4] = 00AFFC10//&arr[1][0] = 00AFFC14//&arr[1][1] = 00AFFC18//&arr[1][2] = 00AFFC1C//&arr[1][3] = 00AFFC20//&arr[1][4] = 00AFFC24//&arr[2][0] = 00AFFC28//&arr[2][1] = 00AFFC2C//&arr[2][2] = 00AFFC30//&arr[2][3] = 00AFFC34//&arr[2][4] = 00AFFC38//通过结果可知,相邻的元素间隔是4,单位字节//连续存放的,第一行放完接着第二行放//行数可以省略,列数不可以省略//随下标的增长,地中也是由低到高的存放的}printf("\n");}return 0;
}

小结
(1)、通过结果可知,相邻的元素间隔是4,单位字节
(2)、连续存放的,第一行放完接着第二行放
(3)、二维数组可理解为一维数组的数组
(4)、行数可以省略,列数不可以省略
(5)、随下标的增长,地址也是由低到高的存放的
(6)、二维数组名:
如:arr[m][n] ---->数组名为arr[m]

4.3、数组越界

数组的下标规定是从0开始的,如果有n个元素,那么最后一个元素的下标就是n-1,
所以,当数组的下标小于0或大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
另外,C语言本身并不会进行越界检查,部分编译器也不一定会进行报错,容易导致程序出现难以发现的bug

4.3.1、数组越界例程

#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6};//下标0~9int i = 0;for (i = 0; i <= 10; i++)//下标=0时,数组越界{printf("%d ",arr[i]);//数组越界}return 0;
}

4.4、数组作为函数的参数

数组可以作为函数的参数
经典的冒泡排序
核心思想:两两相邻的元素比较
冒泡排序的思路

第一趟:
10 9 8 7 6 5 4 3 2 1
9 10 8 7 6 5 4 3 2 1
9 8 10 7 6 5 4 3 2 1
......
9 8 7 6 5 4 3 2 1 10//此时完成一趟冒泡排序,将第一个元素排到了最后
第二趟:
8 9 7 6 5 4 3 2 1 10
8 7 9 6 5 4 3 2 1 10
.....
8 7 6 5 4 3 2 1 9 10//此时完成二趟冒泡排序,将第二个元素排到了最后
......
依次类推:
直至完成升序排序

数组作为函数的参数例程 — 冒泡排序

#include <stdio.h>
int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 };//降序//将arr数组进行排序,排序为升序//冒泡排序int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//趟数for (i = 0; i < sz-1; i++){int j = 0;for (j = 0; j < sz - 1-i; j++)// sz - 1-i元素比较的对数{if (arr[j] > arr[j + 1])//交换{int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

数组作为函数的参数例程 — 函数写法 – 待优化

#include <stdio.h>void sort(int arr[] ,int sz)
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1 - i; j++)// sz - 1-i元素比较的对数{if (arr[j] > arr[j + 1])//交换{int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 };//降序//将arr数组进行排序,排序为升序//冒泡排序int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

小结
发现数组传参过去,代码执行结果与预想不同
探讨数组传参

4.4.1、数组名是什么?

数组名就是地址,通常来说数组名就是数组首元素的地址
但是有两个例外
(1)、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
(2)、& — 取地址操作符 —> &数组名,表示整个数组,取出的是整个数组的地址
除此之外,所遇到的数组名都是数组首元素地址

数组名例程

#include <stdio.h>
int main()
{int arr[10] = { 0 };printf("%p\n",arr);printf("%p\n", &arr[0]);printf("%d\n", sizeof(arr));//对数组名进行加1的情况printf("%p\n", arr);printf("%p\n",arr+1);//+4printf("%p\n", &arr[0]);printf("%p\n",&arr[0]+1);//+4printf("%p\n",&arr);printf("%p\n",&arr+1);//+28(十六进制) --> +40(十进制),加的整个数组大小return 0;
}

小结
(1)、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
(2)、& — 取地址操作符 —> &数组名,表示整个数组,取出的是整个数组的地址
(3)、数组传参的本质就是传首元素的地址

探讨了数组名作为参数的知识,再回到冒泡排序
数组作为函数的参数例程 — 冒泡排序函数写法 — 优化

#include <stdio.h>
//首元素地址,本质就是指针接收参数int arr[] ----> int* arr即可等价
void sort(int* arr ,int sz)
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1 - i; j++)// sz - 1-i元素比较的对数{if (arr[j] > arr[j + 1])//交换{int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main()
{int arr[] = { 10,9,8,7,6,5,4,3,2,1 };//降序//将arr数组进行排序,排序为升序//冒泡排序int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);sort(arr,sz);//学习了什么是数组名,可知这里的arr,不是特殊情况,就是数组的首元素地址for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

5、结语

半亩方糖一鉴开,天光云影共徘徊。
问渠哪得清如许?为有源头活水来。–朱熹(观书有感)

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

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

相关文章

深入了解 LoRaWAN® MAC 命令

本文深入探讨了用于 LoRaWAN 网络管理的 MAC 命令。它面向终端设备软件开发人员和使用 LoRa 构建设备的团队经理,这些设备实现了LoRaWAN 链路层规范 v1.0.4。本文帮助您了解不同类型的 MAC 命令、每个命令的用途以及如何解释这些命令。 已经使用LoRaMAC-Node™等软件来处理 MA…

C# Blazor 学习笔记(2):组件模板化/插槽

文章目录 前言组件模板为什么要组件模板不使用组件模板使用后 代码部分 和直接绑定数据有和区别&#xff1f; 前言 组件模板化我们在WPF经常遇到&#xff0c;这里将一下Blazor是如何解决的。 组件模板 为什么要组件模板 虽然组件化了之后&#xff0c;我们写代码的速度已经很…

1.netty介绍

1.介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty 2.应用…

Linux 新硬盘分区,挂载

在Linux系统中&#xff0c;当你插入新的硬盘时&#xff0c;你需要进行一些步骤来使系统识别并使用它。以下是一些常见的步骤&#xff1a; 确保硬盘已正确连接到计算机。检查硬盘的电源和数据线是否牢固连接。 打开终端或命令行界面。 运行以下命令来扫描新硬盘&#xff1a; s…

性能测试必备监控技能windows篇

前言 在手头没有专门的第三方监控时&#xff0c;该怎么监控服务指标呢&#xff1f;本篇就windows下监控进行分享&#xff0c;也是我们在进行性能测试时&#xff0c;必须掌握的。下面我们就windows下常用的三种监视工具进行说明&#xff1a; 任务管理器 资源监视器 性能监视器…

找样机素材,就上这5个网站,免费下载~

设计师经常需要用到各种样机模型来展示直接的作品&#xff0c;今天我就分享几个可以免费下载样机模型的网站&#xff0c;大家赶紧收藏起来&#xff01; 菜鸟图库 https://www.sucai999.com/searchlist/3217.html?vNTYxMjky 菜鸟图库有多种类型的设计素材&#xff0c;像平面、…

Element-plus侧边栏踩坑

问题描述 el-menu直接嵌套el-menu-item菜单&#xff0c;折叠时不会出现文字显示和小箭头无法隐藏的问题&#xff0c;但是实际开发需求中难免需要把el-menu-item封装为组件 解决 vue3项目中嵌套两层template <template><template v-for"item in list" :k…

[ 容器 ] Docker 安全及日志管理

目录 Docker 容器与虚拟机的区别Docker 存在的安全问题Docker 架构缺陷与安全机制Docker 安全基线标准容器相关的常用安全配置方法限制流量流向镜像安全避免Docker 容器中信息泄露DockerClient 端与 DockerDaemon 的通信安全 容器的安全性问题的根源在于容器和宿主机共享内核。…

winform学习(1)------多窗口控制

在窗口中跳转到另外一个窗口&#xff0c;需要创建另外一个窗口的对象&#xff0c;然后通过窗口对象的show方法进行展示 这里展示了通过当前窗口的button按键来打开另外一个窗口 private void button1_Click(object sender, EventArgs e){Form2 form new Form2();form.Size n…

linux V4L2子系统——v4l2架构(1)之整体架构

概述 V4L&#xff08;Video for Linux&#xff09;是Linux内核中关于视频设备的API接口&#xff0c;涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本&#xff0c;经过修改bug和添加功能&#xff0c;Linux内核2.5版本推出了V4L2&#xff08…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

单机版Antelope版本的OpenStack自动化安装

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 当前版本的支持安装单机版Antelope版本的OpenStack。部署脚本基于python3写的。操作系统基于Ubuntu 22.04.2 LTS。 一、基础配置。 1、安装操作系统&#xff0c;安装完成之后除了可上网&#xff0c;无需做任…

【shell】获取ping的时延数据并分析网络情况

网络情况经常让我们头疼&#xff0c;每次都需要手动在终端ping太麻烦了&#xff0c;不如写个脚本ping并将数据带上时间戳存入文件&#xff0c;然后也可以分析哪个时间段网络比较差。 创建一个demo.sh文件&#xff1a; #!/bin/bash # 清理日志 net_path"./network/"…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇&#xff1a; 《STM32 USB使用记录&#xff1a;HID类设备&#xff08;前篇&#xff09;》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

高并发架构去重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发&#xff1a;探究流量控制解决方案 主从选举机制&#xff0c;架构高可用性的不二选择 高并发架构去重难&#xff1f;架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 …

<findbugs>静态代码分析工具

背景&#xff1a; IDEA安装的findbug插件目前无法和jenkins的扫描结果保持一致&#xff0c;因为&#xff1a;没有对应jenkins上findbug的版本&#xff1b; 原理&#xff1a; 将jenkins服务器上的findbugs插件&#xff0c;拷贝到本地&#xff0c;修改build.xml内容以匹配目录…

Resnet与Pytorch花图像分类

1、介绍 1.1数据集介绍 flower_data├── train│ └── 1-102&#xff08;102个文件夹&#xff09;│ └── XXX.jpg&#xff08;每个文件夹含若干张图像&#xff09;├── valid│ └── 1-102&#xff08;102个文件夹&#xff09;└── ─── └── XXX.jp…

Python读取csv、Excel文件生成图表

简介 本文章介绍了通过读取 csv 或 Excel 文件内容&#xff0c;将其转换为折线图或柱状图的方法&#xff0c;并写入 html 文件中。 目录 1. 读取CSV文件 1.1. 生成折线图 1.1.1. 简单生成图表 1.1.2. 设置折线图格式 1.2. 生成柱状图 1.2.1. 简单生成图表 1.2.2. 设置柱…

【Rust 基础篇】Rust Trait 实现:灵活的接口抽象

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;其设计哲学是在不损失性能的前提下&#xff0c;保障代码的内存安全和线程安全。为了实现这一目标&#xff0c;Rust引入了"所有权系统"、"借用检查器"等特性&#xff0c;有效地避免了常见…