C语言复习笔记--数组

news2025/3/21 23:56:27

        今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始.

数组的概念

        数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组.

        下面从一维数组说起.

一维数组的创建和初始化

  数组创建

        ⼀维数组创建的基本语法如下:(数组在创建的时候可以指定数组的大小和数组的元素类型).

type arr_name[常量值];

        1.type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型

        2.arr_name 指的是数组名的名字

        3.[] 中的常量值是⽤来指定数组的大小的

  数组的初始化

        数组在创建的时候,我们需要给定⼀些初始值值,这种就称为初始化.数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中.

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void Print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	//完全初始化
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
	//不完全初始化:其余的会被默认初始化为0
	int arr2[10] = { 1,2 };
	//[]中不写,初始化为几个就是几个元素
	int arr3[] = { 1,2,3,4,5 };
	Print(arr1, 10);
	Print(arr2, 10);
	Print(arr3, sizeof(arr3)/sizeof(arr3[0]));

	return 0;
}

  数组的类型

        数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型.

int arr[10]的类型就是int [10];

char ch[5]的类型是 char [5];

一维数组的使用

        简单的了解了一维数组后,让我们复习一下它的使用.

  数组下标

        定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1.如下图:

        我们通常用下标引用符[ ]来访问数组元素.例如我们访问下标为7的元素,我们就可以使用arr[7].

  数组元素的打印和输入

        在上面初始化中为了看见初始化的结果,我已经将打印的代码先使用了.因为数组用下标访问,所以只要便利数组下标就可以打印数组了.

        数组的输入与打印类似,大概如下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void Print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	Print(arr, 10);
	return 0;
}

  一维数组在内存中的存储

        想要了解一维数组在内存中的存储最好的方法就是打印数组中每个元素的地址.代码和结果如下图.

        由上图输出结果可知,每两个元素之间都隔离四个字节,而一int类型就占四个类型.所以我们得出结论:数组在内存中是连续存放的.

  sizeof计算数组元素个数

        在遍历数组的时候,我们经常想知道数组的元素个数.在C语言中我们可以用sizeof来实现.

        sizeof中C语⾔是⼀个关键字,是可以计算类型或者变量大小的,(他的返回值是所计算类型或变量所占的字节数),其实 sizeof 也可以计算数组的大小.如下

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	return 0;
}

        因为数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。这⾥我们选择第⼀个元素算大小就可以.然后二者相除就可以得出数组元素个数.

int main()
{
	int arr[10] = { 0 };
	int a = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", a);
	return 0;
}

        有了这个方法,以后在代码中需要数组元素个数的地⽅就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了.

二维数组

  二维数组得概念

        前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是二维数组⼆维数组作为数组元素的数组被称为三维数组二维数组以上的数组统称为多维数组.

  二维数组的创建和初始化

        二维数组的创建:

type arr_name[常量值1][常量值2];

常量值1表示二维数组有几行

常量值2表示二维数组有几列

type是元素类型

arr_name是数组名

        那⼆维数组如何初始化呢?像⼀维数组⼀样,也是使⽤⼤括号初始化的.

        不完全初始化

int main()
{
	//不完全初始化
	int arr1[3][5] = { 1,2,3,4,5 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr1[i][j]);
		}
		printf("\n");
	}
	printf("\n");
    //按照⾏初始化
	int arr2[3][5] = { {1,2},{3},{4,5} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr2[i][j]);
		}
		printf("\n");
	}
	return 0;
}

        输出结果

        完全初始化

int main()
{
	//完全初始化
	int arr1[2][5] = { 1,2,3,4,5,6,7,8,9,0};
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr1[i][j]);
		}
		printf("\n");
	}
	return 0;
}

        输出结果

        类似于一维数组,初始化时省略行,但是不能省略列

int main()
{
	int arr1[][5] = { 1,2,3,4,5,6 };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr1[i][j]);
		}
		printf("\n");
	}
	return 0;
}

        输出结果

  二维数组的使用

        ⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定 数组中的⼀个元素.

        如上图,最右侧绿⾊的数字表示行号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始的,

        例如,我们说:第2行,第4列,快速就能定位出7.

  二维数组的输入和输出

        同样在上面为了观察初始化的结果,我已经使用了二维数组的输出,输入与输出类似.代码见下

int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	int i = 0;
	//输⼊
	for (i = 0; i < 3; i++) //产⽣⾏号
	{
		int j = 0;
		for (j = 0; j < 5; j++) //产⽣列号
		{
			scanf("%d", &arr[i][j]); 
		}
	}
	//输出
	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个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的.如下图所示

        还有一点点为c99中的变长数组,了解即可~以上就是所有复习内容啦,下篇复习见~

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

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

相关文章

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天&#xff0c;股票分析作为投资决策的核心环节&#xff0c;正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理&#xff0c;效率低下且成本高昂&#xff0c;而人工智能&#xff08;AI&#xff09;的引入为这一领域带来…

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…

强大的AI网站推荐(第一集)—— Devv AI

网站&#xff1a;Devv AI 号称&#xff1a;最懂程序员的新一代 AI 搜索引擎 博主评价&#xff1a;我的大学所有的代码都是使用它&#xff0c;极大地提升了我的学习和开发效率。 推荐指数&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x…

模块二 单元4 安装AD+DC

模块二 单元4 安装ADDC 两个任务&#xff1a; 1.安装AD活动目录 2.升级当前服务器为DC域控制器 安装前的准备工作&#xff1a; 确定你要操作的服务器系统&#xff08;Windows server 2022&#xff09;&#xff1b; 之前的服务器系统默认是工作组的模式workgroup模式&#xff08…

蓝桥杯备考:数学问题模运算---》次大值

这道题&#xff0c;由于数据规模是2e5&#xff0c;我们直接暴力的话是一定会超时的 所以我们得想个办法&#xff0c;我们先把所有的数排序去重 我们先想想如果要找最大值&#xff0c;怎么找 这时候我们要分类讨论 ①如果是大数模小数&#xff0c;那结果肯定是小于小数的&am…

k8s1.30 部署calio网络

一、介绍 网路组件有很多种&#xff0c;只需要部署其中一个&#xff0c;推荐calio。 calio是一个纯三成的数据中心网络方案&#xff0c;calico支持广泛的平台。如k8s&#xff0c;openstack等。 calio在每一个计算节点利用linux内核&#xff0c;实现了一个高效的虚拟路由器来…

Elasticsearch:为推理端点配置分块设置

推理端点对一次可处理的文本量有限&#xff0c;具体取决于模型的输入容量。分块&#xff08;Chunking&#xff09; 是指将输入文本拆分成符合这些限制的小块的过程&#xff0c;在将文档摄取到 semantic_text 字段时会进行分块。分块不仅有助于保持输入文本在可处理范围内&#…

[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)

导语&#xff1a; 在工业控制领域&#xff0c;设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码&#xff0c;威胁设备稳定运行。本文将手把手教你使用 DriverView工具&#xff0c;高效完成工控机驱动安全检查&#xff0c;精准识别可疑驱动&a…

多无人车协同探索开源包启动文件介绍(上)

在之前介绍的《多无人车协同探索开源包部署教程及常见报错解决方式》中运行多无人车协同探索时&#xff0c;先后运行了两个launch文件 multiple_tb3_house.launch 和three_robots.launch &#xff0c;本文来进一步看一下这两个启动文件以及其调用的move_base .launch 和multi_t…

Linux驱动学习笔记(三)

并发与竞争 1.在编写驱动程序的时候&#xff0c;要尽量避免让驱动程序存在并发和竞争&#xff0c;Linux内核里面提供了几种处理并发与竞争的方法&#xff0c;分别是&#xff1a;原子操作、自旋锁、信号量和互斥体。 原子操作&#xff1a;Linux的原子操作基于atomic_t数据类型…

leetcode热题100道——两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…

Git远程拉取和推送配置

Git进行远程代码拉取和推送时候提示配置user.name 和 user.email 背景&#xff1a;换新电脑后使用Git进行代码拉取和推送过程中&#xff0c;提示“Make sure you configure your “user.name” and “user.email” in git.”。这个配置针对git的正常使用仅需要配置一次&#xf…

基于SpringBoot+Vue3实现的宠物领养管理平台功能七

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高&#xff0c;越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员&#xff0c;人们对于宠物的关爱和照顾也日益增加。然而&#xff0c;传统的宠物领养流程存在诸多不便&a…

调研报告:Hadoop 3.x Ozone 全景解析

Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。 Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。 Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…

【Linux】Makefile秘籍

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有问题&#xff0c;还请多多包涵&a…

玩转物联网-4G模块如何快速将数据上传到巴法云(TCP篇)

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 巴法云平台设备创建 3.1 创建账号 3.2 进入巴法云 3.3 获取联网参数 4 连接巴法云 4.1 打开配置工具读取基本信息 4.2 设置连接参数进行数据交互 4.2.1 建立TCP连接 4.2.2 订阅主题 4.2.3 发布信…

vue3+ts心得

1、Vue3核心 1、setup setup里弱化this&#xff0c;return可以返回函数&#xff0c;返回后页面也显示那个函数值 data里面是可以用this.来获取setup里的值&#xff0c;这个是单向的 vue3两个script标签不要觉得奇怪&#xff0c;一个是配置组合式api的&#xff0c;一个是配置组…

SQLark中如何进行数据筛选与排序

本文将为你介绍在 SQLark 中如何进行数据筛选与排序&#xff0c;掌握这些操作能够极大提升你的工作效率。 SQLark官网链接:www.sqlark.com 数据筛选 在数据库操作中&#xff0c;数据筛选是一项关键功能&#xff0c;它依据特定条件对数据进行过滤&#xff0c;帮助用户从海量数据…