【C语言】数组
一维数组的创建和初始化
数组是一组相同类型元素的集合。
数组的创建
//数组的创建方式:type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式,用来指定数组的大小
数组创建的实例:
- 数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{int arr1[5];char arr2[8];float arr3[15];double arr4[10];return 0;
}
- C99标准引入了变长数组的概念,数组的大小可以使用变量指定,但是在VS中数组不能初始化。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{n = 10;int arr[n];return 0;
}
数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };//完全初始化int arr2[10] = { 1,2,3,4,5 };//不完全初始化,剩余部分默认初始化为零char arr3[10] = { 'a','b', 99 };//字符类型数组默认将数字对应为字符的ASCLL码值;char arr4[10] = "abcdef";//不完全初始化,剩余部分默认初始化为‘\0’//如果数组初始化了,可以不指定数组的大小;数组大小会根据初始化的内容来决定char arr5[] = { 'a','b', 99 };char arr6[] = "abc";return 0;
}
一维数组的使用
对于数组的使用介绍一个操作符: [ ] (下标引用操作符)。它其实就是数组访问的操作符。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{int arr[10] = { 0 };//数组的不完全初始化//计算数组的元素个数int sz = sizeof(arr) / sizeof(arr[0]);//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:int i = 0;//做下标for (i = 0; i < 10; i++){arr[i] = i;}//输出数组的内容for (i = 0; i < 10; ++i){printf("%d ", arr[i]);}return 0;
}
总结:
-
数组是使用下标来访问的,下标是从0开始。
-
数组也是有类型的,去掉数组名就是数组的类型。

-
数组的大小可以通过计算得到。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:
-
数组在内存中是连续存放的。
-
随着下标的增长,地址是由低到高变化的。
因此我们只要拿到首元素地址,就相当于知道了所有元素的地址。

二维数组的创建和初始化
二维数组的创建
//数组创建
int arr[3][4]; //3行4列
char arr[3][5]; //3行5列
我们想象中的多维数组是这样的:

二维数组的初始化
//数组初始化
int arr[3][4] = {1,2,3,4}; //不完全初始化
int arr[2][4] = {{1,2},{4,5}}; //不完全初始化
int arr[][4] = {{2,3},{4,5}}; //不完全初始化
//二维数组如果有初始化,行可以省略,列不能省略
二维数组的使用
二维数组的使用也是通过下标的方式,行和列的下标都是从零开始的。

二维数组在内存中的存储

我们惊奇的发现二维数组在换行时地址还是增加4个字节,这说明了二维数组在内存中还是连续存放的。
如果把二维数组的每一行看作一个一维数组,那么每一行的一维数组也有数组名
arr[0]就是第一行的数组名,arr[1]就是第二行的数组名,arr[3]就是第三行的数组名,以此类推。
数组越界
数组的下标是有范围限制的。
数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以我们在写代码时,最好自己做越界的。

同样的,二维数组的行和列也可能存在越界。
数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲解的是算法思想)函数将一个整形数组排序。
冒泡排序函数的错误设计
#include <stdio.h>
void bubble_sort(int 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 - i - 1; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[] = { 3,1,7,5,8,9,0,2,4,6 };//排升序//冒泡排序bubble_sort(arr);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

调试之后可以看到 bubble_sort 函数内部的 sz 是1。难道数组作为函数参数的时候,不是把整个数组的传递过去?
数组名是什么?
数组名是数组首元素的地址。

有两个例外:
- sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。 - &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
冒泡排序函数的正确设计
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。
那么,函数内部的 sizeof(arr) 结果是 4/8。
#include <stdio.h>
void bubble_sort(int arr[],int sz)//int arr[]本质上是指针int* arr来接收地址
{int i = 0;//冒泡排序的趟数for (i = 0; i < sz - 1; i++){int j = 0;//一趟冒泡排序for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[] = { 3,1,7,5,8,9,0,2,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);//排升序//冒泡排序bubble_sort(arr, sz);//arr是数组首元素地址int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
数组的应用实例:三子棋
数组的应用实例:扫雷游戏
相关文章:
【C语言】数组
一维数组的创建和初始化 数组是一组相同类型元素的集合。 数组的创建 //数组的创建方式:type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式,用来指定数组的大小数组创建的实例: 数组创建ÿ…...
常见测试技术都有哪些?
测试技术是用于评估系统或组件的方法,目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误,或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开发软件所使用的最佳实践。这些技术可以确保产品或软件的整体质量…...
Spring事务控制
1.事务介绍 1.1什么是事务? 当你需要一次执行多条SQL语句时,可以使用事务。通俗一点说,如果这几条SQL语句全部执行成功,则才对数据库进行一次更新,如果有一条SQL语句执行失败,则这几条SQL语句全部不进行执…...
swaggerUI不好用,试试这个openapiUI?
title: swaggerUI不好用,试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具,它的轻量风格个人觉得还是不错的,但是它…...
嵌入式物联网项目开发实战例程-STM32F103系列之外围器件代码
开发STM32F103很好的参考例程,轻松实现各类外围器件的开发。持续更新中,欢迎关注及收藏。 0001基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码.zip 0002基于STM32F103单片机GPIO实现按键KEY的检测程序代码.zip 0003基于STM32F103单片机GPIO实现外部…...
Docker Compose--部署SpringBoot项目--实战
原文网址:Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题,…...
单电阻FOC算法实现永磁同步电机的调整步骤和设置
本文档介绍了使用 单电阻FOC 算法实现永磁同步电机(Permanent Magnet Synchronous Motor,PMSM)调整所需的步骤和设置。由于不同电机存在参数差异,因此需针对不同的电机和负载对该算法进行调整。该电机库已经在在落地扇和空净等风机…...
化学DS-1040 Tosylate 抑制剂 1335138-89-0科研用途
化合物1219962-49-8是一种小分子化合物,分子式为C15H25N3O4,相对分子质量为305.37。该化合物为白色至灰白色粉末,不溶于水,易溶于有机溶剂,如甲醇、乙醇等。 AT791是一种与细胞周期调控相关的蛋白激酶,参与…...
PaddlePaddle初使用
模型导出与预测 # -c 后面设置训练算法的yml配置文件 # -o 配置可选参数 # Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。pytho…...
【FPGA】分享一些FPGA数字信号处理相关的书籍
在做FPGA工程师的这些年,买过好多书,也看过好多书,分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...
深度解析JavaScript面试热点:事件循环、上下文、箭头函数、变量作用域与ES6模块
JavaScript面试中经常涉及到事件循环、上下文、箭头函数、变量作用域以及ES6模块等核心概念。通过清晰的代码示例,我们深入讨论这些主题,揭示其中的关键细节。 事件循环(Event Loop) JavaScript开发者每天都与事件循环打交道&am…...
Javaweb之Mybatis的动态SQL的详细解析
3. Mybatis动态SQL 3.1 什么是动态SQL 在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。 如果页面…...
物联网与智能家居:跨境电商与未来生活的融合
物联网(Internet of Things,IoT)和智能家居技术正迅速崛起,成为跨境电商领域的创新引擎。这两者的巧妙结合不仅为消费者提供更智能、便捷的生活方式,同时也为电商平台和制造商带来了全新的商机。本文将深入探讨物联网与…...
Java内存模型(JMM)是基于多线程的吗
Java内存模型(JMM)是基于多线程的吗 这个问题按我的思路转换了下,其实就是在问:为什么需要Java内存模型 总结起来可以由几个角度来看待「可见性」、「有序性」和「原子性」 面试官:今天想跟你聊聊Java内存模型&#…...
Linux离线安装MySQL(rpm)
目录 下载安装包安装MySQL检测安装结果服务启停MySQL用户设置 下载安装包 下载地址:https://downloads.mysql.com/archives/community/ 下载全量包如:(mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar) 解压:tar -xzvf mysql-8.1.0-1.el7.x86_64.…...
用 Socket.D 替代原生 WebSocket 做前端开发
socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据,但功能更强大。 功能原生 websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应(类似于 http)sendAndSubscribe无…...
Transformer架构和对照代码详解
1、英文架构图 下面图中展示了Transformer的英文架构,英文架构中的模块名称和具体代码一一对应,方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看,Transformer的编码器是由多个相同的层叠加⽽ 成的,每个…...
大数的乘法
题目描述 求两个不超过100位的非负整数的乘积。 输入 有两行,每行是一个不超过100位的非负整数,没有多余的前导0。 输出 一行,相乘后的结果。 样例输入 Copy 123456789 123456789样例输出 Copy 15241578750190521 代码实现࿱…...
年度征文 | 机器学习之心的2023
机器学习之心的2023 2023是极其复杂的一年。 生活上,养了很多宠物。 工作上,写了不少博客。 虽然遇见更多让人不开心的事情,但总体还是美好的。 愿大家新的一年健康平安,生活幸福! 机器学习是一项庞大的工程࿰…...
13.Kubernetes应用部署完整流程:从Dockerfile到Ingress发布完整流程
本文以一个简单的Go应用Demo来演示Kubernetes应用部署的完整流程 1、Dockerfile多阶段构建 Dockerfile多阶段构建 [root@docker github]# git clone https://gitee.com/yxydde/http-dump.git [root@docker github]# cd http-dump/ [root@docker http-dump]# cat Dockerfile …...
开源免费压缩软件PeaZip:跨平台文件压缩与管理的全能解决方案
开源免费压缩软件PeaZip:跨平台文件压缩与管理的全能解决方案 【免费下载链接】PeaZip Free Zip / Unzip software and Rar file extractor. Cross-platform file and archive manager. Features volume spanning, compression, authenticated encryption. Supports…...
SYNBO 已上线 BitMart 交易所,Synbo Camp 同步开启
2026年3月31日,Synbo.io 原生代币 SYNBO 将上线 BitMart 交易所,这也成为 Synbo 发展进程中的又一里程碑,并同步开启 Synbo Camp 招募活动。这不仅是一次产品上线与活动发布,更标志着 Synbo 正式向行业递交一套关于未来融资协作方…...
如何将网页转化为可编辑设计稿?3大核心场景与实现方案
如何将网页转化为可编辑设计稿?3大核心场景与实现方案 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 你是否曾遇到过看到优秀网页设计却无法直接复用的困境ÿ…...
你的代码为什么跑不满GPU?从Cache命中率和指令集角度拆解Roofline下的性能损失
你的代码为什么跑不满GPU?从Cache命中率和指令集角度拆解Roofline下的性能损失 当你在AI训练或高性能计算任务中发现程序性能远低于GPU的理论峰值时,Roofline模型往往能直观揭示问题所在——但真正的挑战在于,如何从那些落在屋顶线之下的数据…...
【 技术方案设计】复杂分布式系统统一日志Trace平台 + 用户行为打点分析平台
前端+后端(分布式应用有 fastapi, springboot 等应用)系统,要做一个统一日志 trace 平台,并对用户行为日志做打点分析。给我一个详细的技术方案设计 + 数据存储 + 前后端 sdk + 接口 API 设计 统一日志Trace平台 + 用户行为打点分析平台 技术方案设计 文章目录 统一日志Tr…...
WSABuilds:3种架构适配+5分钟部署,打造Windows安卓开发与运行环境
WSABuilds:3种架构适配5分钟部署,打造Windows安卓开发与运行环境 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk …...
RoboMaster装甲板识别避坑指南:灯条匹配参数怎么调?反光、远距离识别失败怎么办?
RoboMaster装甲板识别实战调参手册:从灯条匹配到抗干扰优化 第一次在赛场边调试装甲板识别算法时,我盯着屏幕上疯狂跳动的识别框,突然理解了什么叫"实验室里的王者,赛场上的青铜"。当场地灯光直射装甲板、敌方机器人高速…...
零基础玩转OpenClaw:Qwen3-32B镜像云端体验与技能市场探索
零基础玩转OpenClaw:Qwen3-32B镜像云端体验与技能市场探索 1. 为什么选择云端体验OpenClaw 第一次接触OpenClaw时,我被它的自动化能力深深吸引,但本地安装的复杂程度让我望而却步。直到发现星图平台的Qwen3-32B镜像,才真正打开了…...
OpenClaw+千问3.5-9B监控方案:网站异常自动检测与告警
OpenClaw千问3.5-9B监控方案:网站异常自动检测与告警 1. 为什么需要轻量级网站监控 去年我的个人博客遭遇了一次持续6小时的宕机,直到读者发邮件反馈才发现问题。传统监控工具如UptimeRobot虽然能检测HTTP状态,但无法识别内容篡改或样式异常…...
Slowloris安装与部署:从源码到生产环境的完整流程
Slowloris安装与部署:从源码到生产环境的完整流程 【免费下载链接】slowloris Low bandwidth DoS tool. Slowloris rewrite in Python. 项目地址: https://gitcode.com/gh_mirrors/sl/slowloris Slowloris是一款基于Python的低带宽DoS(拒绝服务&a…...
