【初识C语言】数组

news2025/1/12 6:18:54

【初识C语言】数组

    • 一.一维数组
      • 1.什么是数组
      • 1.一维数组的创建和初始化
        • 1.数组如何创建
        • 2.数组如何初始化
        • 3.用sizeof来求数组的长度
      • 2.一维数组的使用
      • 3.一维数组在内存中的存储方式
    • 二. 二维数组
      • 1,什么是二维数组
      • 2.二维数组的创建
      • 3.二维数组的初始化
      • 4.二维数组的使用
      • 5.二维数组在内存中的存储
    • 三,数组越界
    • 四.数组作为函数参数

一.一维数组

1.什么是数组

1.什么是数组?
数组是一组相同类型元素的集合。比如说我们要定义10个整型变量(1~10),没学过数组之前咱就是一个变量定义一个数字,

int x1 = 1;
int x2 = 2;
int x3= 3;
int x4 = 4;
.....
int x10 = 10;

你会发现,如果我们定义一个变量就要创建一个变量,那咱要定义个成百上千甚至更多的变量时可不得了,而且你会发现,这些的类型都是相同的,所以,咱就引入了数组的概念。还是以上面为例,如果我们要定义十个整型变量,就可以这么写

int x[10] = {1,2,3,4,5,6,7,8,9,10};

1.一维数组的创建和初始化

1.数组如何创建

元素类型 数组名 [常量表达式 ];
例子:

int arr [10];

int count  = 10;
int arr_2[count];//用变量来表示元素个素的是变长数组
//注意事项:数组创建时,在C99标准之气,[]中要给一个变量才可以,不能使用变量,只有在C99标准下支持了变长数组的概念。
float arr_3[20];
double arr_4[50];
char arr_5[100];

2.数组如何初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
1.不完全初始化:
初始化的值少于定义的元素个数,未初始化后面的就自动补0

#include<stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3 };
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

在这里插入图片描述
2.完全初始化:就是把初始话的值的个数等于定义的的长度

#include<stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

在这里插入图片描述

3.用sizeof来求数组的长度

sizeo语句是用来求数组字节的长度:
sizeof(数组名)= 整个数组的字节长度;
sizeof(数组名[ 符合数组长度的任意数字]) = 该数组的一个字节长度;
sizeof(数组名) /sizeof(数组名[ 符合数组长度的任意数字] = 数组长度

比如:

#include<stdio.h>

int main()
{
	int arr[] = {0,1,2,3,4,5,6,7,8,9};
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr[0]));

	return 0;
}

在这里插入图片描述

2.一维数组的使用

对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。他其实就是用来进行数组访问的操作符。注意下标是从0开始;
比如

#include<stdio.h>
int main()
{
	int arr[5] = { 12,34,56,78,99 };
	printf("%d\n", arr[0]);
	printf("%d\n", arr[4]);

	return 0;
}

在这里插入图片描述

我要访问arr数值中的第一个元素,那我下标为arr[ 0 ],要访问最后一个元素,那就是arr[ 4 ];

总结:
数组是使用下标来访问的,下标从0开始,最后一个元素的下标是定义的长度 - 1;

3.一维数组在内存中的存储方式

随着数组下标的增长,元素的地址也是在规律的增长·,数组在元素中是连续存放的

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}
	return 0;
}

在这里插入图片描述

二. 二维数组

1,什么是二维数组

二维数组你可以理解为构成行列的多个一维数组。

#include<stdio.h>
int main()
{
	int arr1[5] = {0,1,2,3,4,};
	int arr2[5] = {5,6,7,8,9};
	int arr3[5] = { 10,11,12,13,14 };
	

	return 0;
}

用二维数组来表示元素的为位置
在这里插入图片描述

2.二维数组的创建

与一维数组类似,不过是后边了一个[ ]

数组名[ ][ ]
第一个[ ]表示数组的行;
第二个[ ]表示数组的列;

int arr[3][4];
char arr[3][5];
double arr[2][4];

3.二维数组的初始化

二维数组初始化行可以省略,列不可以省略,你想像给你一排数字,只告诉你行数根本不知道怎么排,但直到列数确是可以,不信你试试。

int main()
{
	//数组的初始化
	int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };
	int arr2[4][5] = { {1,2,3 }, {2, 3, 4 }, {3, 4, 5, 6, 7}, {5, 6, 7, 8, 9} };
    //二维数组即使初始化的了
    //行是可以省略的,但是列是不能省略的
	int arr3[][5] = { {1,2,3 }, {2, 3, 4 }, {3, 4, 5, 6, 7}, {5, 6, 7, 8, 9} };

	return 0;
}

4.二维数组的使用

二维数组的使用也是通过下标的方式

int main()
//{
int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };
	printf("%d\n", arr[2][3]);
	int i = 0;
	//行号
	for (i = 0; i < 4; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);//0 1 2 3 4
		}
		printf("\n");
	}
	return 0;

在这里插入图片描述

5.二维数组在内存中的存储

与一维数组一样,随着数组下标的增长,元素的地址也是在规律的增长·,二维数组元素再内存中是连续存放的

int main()
{
	int arr[4][5] = { 0 };
	int i = 0;
	//行号
	for (i = 0; i < 4; i++)
//	{
		int j = 0;
	for (j = 0; j < 5; j++)
	{
		printf("&arr[%d][%d] = %p\n",i,j, &arr[i][j]);
		}
	}
	return 0;
}

在这里插入图片描述

三,数组越界

数组的下标是有范围限制的。
> 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n -1。所以数组的下标如果小于0,或者大于n -1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,就不意味着程序是正确的,所以在写代码时,注意检查数组的越界

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	//0~10
	
	//
	for (i = 0; i <= 10; i++)//当i = 10时,就越界访问了
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

在这里插入图片描述

四.数组作为函数参数

前面我们提到,数组名表示的数组首元素的地址,所以当数组名作为函数参数时,其实时只有首元素的地址传过去,并非时整个数组,所以你想在函数求数组长度是也是做不到的(你只有首元素的地址,也就只是求得一个首元素的字节长度!!!)所以我们要在主函数求的数组长度时,也将数组的长度作为函数参数传递过去。这点尤其重要!!!

举个例子:输入10个数字,然后用冒泡法来进行升序

int main()
{
	void bubble_sort(int arr[10], int sz);
	int arr[10] = { 0 };
	//输入
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}
	//排序 - 升序
	bubble_sort(arr,sz);//让这个函数来完成数组arr中数据的排序
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}


void bubble_sort(int*arr, int sz)//这里的arr的本质是指针
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		//一趟每部比较的对数
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				//交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

在这里插入图片描述

创作不易,免费给个赞赞吧~
请添加图片描述

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

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

相关文章

GD32F4x 加密(开启读保护功能)

参考链接1&#xff1a;&#xff08;设置读保护&#xff09; GD32F4x 如何开启读保护功能&#xff08;芯片加密&#xff09;&#xff1f;_EmbeddedOsprey的博客-CSDN博客 参考链接2&#xff1a;读取芯片ID进行加密 《嵌入式 – GD32开发实战指南》第19章 程序加密_gd32大小端…

A-4D战斗机姿态控制的模型预测控制方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 飞行器姿态控制通过复杂的动力学来描述&#xff0c;这使得该系统的控制算法的设计变得困难。除此之外&#xff0c;战斗机尤其被设…

[230531] 托福听力真题|TPO67配套词汇|10:23-11:23

目录 Con1 Lec1(ecology) Lec2(psychology) Con2 Lec3(art history) 重点复习巩固lecture 两篇Con都为简单等级 Con1 emergency n 紧急情况&#xff1b;突发情况 deal with 处理 dormitory n 宿舍 facility n 设备 supervisor n 监督…

ov2640子设备视频操作详细分析

ov2640子设备视频操作详细分析 文章目录 ov2640子设备视频操作详细分析ov2640_subdev_video_ops视频操作ov2640_s_stream开始流ov2640_g_fmt 获取格式ov2640_s_fmt设置格式ov2640_try_fmt尝试格式ov2640_cropcap裁剪能力ov2640_g_crop获取裁剪ov2640_enum_fmt枚举格式ov2640_g_…

MySql-高级(分库分表问题简析) 学习笔记

文章目录 1. 为什么要分库分表&#xff1f;2. 用过哪些分库分表中间件&#xff1f;不同的分库分表中间件都有什么优点和缺点&#xff1f;3. 你们具体是如何对数据库如何进行垂直拆分或水平拆分的&#xff1f;4. 分库分表时&#xff0c;数据迁移方案5. 如何设计可以动态扩容缩容…

kafka本地测试消息

一安装JDK 二zookeeper安装 Apache ZooKeeper conf下修改cfg文件名 为zoo.cfg 打开该文件编辑 配置环境变量 右击电脑--属性--高级系统设置--选择环境变量 新建系统变量 变量名&#xff1a;ZOOKEEPER_HOME 变量值为zookeeper的路径 然后编辑环境变量Path 新增%ZOOKEEPER…

关于信号包络检测

说明 最近在调研学习数字滤波的东西&#xff0c;看到关于信号包络检测这样一个知识点&#xff0c;感觉很有意思&#xff0c;于是想着简单捋清楚并写篇博文装载起来总结一下。本博文与车载毫米波雷达的信号和数据处理无关&#xff0c;所以本文不会放到车载毫米波雷达系列专题规划…

第十二章 Productions最佳实践 - 命名约定

文章目录 第十二章 Productions最佳实践 - 命名约定命名约定业务服务路由进程路由规则集业务操作数据转换 自定义架构类别 第十二章 Productions最佳实践 - 命名约定 命名约定 本主题解释命名约定的重要性并提供示例。 通常&#xff0c;将逐步开发产品&#xff0c;一次开发一…

CAD数据库下包含的表记录

AutoCAD数据库(AcDb)是一些存储在数据库中的对象的集合。 数据词典&#xff0c;符号表是存储数据库对象的容器&#xff08;Container Object&#xff09;&#xff0c;用于组织和管理数据库对象。这两种容器对象都有与之相关的符号名&#xff0c;用字符来表示。 符号表是固定的…

chatgpt赋能Python-python_ipython

Python和IPython&#xff1a;SEO编程最佳实践 Python 是一种高级动态编程语言&#xff0c;被许多人用于开发各种应用程序和脚本。它是一个易于学习和使用的语言&#xff0c;提供了一些流行的框架和库来减少开发时间。另一方面&#xff0c;IPython 是Python的交互式命令行界面和…

面试:Babel 的编译过程

Babel 是一个 JavaScript 编译器&#xff0c;是一个工具链&#xff0c;主要用于将采用 ECMAScript 2015 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中。 Babel 本质上就是在操作 AST 来完成代码的转译。AST是抽…

Ubuntu GitLab服务器git-data中tmp_pack_xxx文件占满磁盘

Ubuntu GitLab服务器git-data中tmp_pack_xxx文件占满磁盘 目录 Ubuntu GitLab服务器git-data中tmp_pack_xxx文件占满磁盘一、问题发现二、查找原因三、解决方法 服务器版本&#xff1a; cat /proc/version&#xff1a;Linux version 4.15.0-142-generic (builddlgw01-amd64-039…

Spring Initializr方式构建Spring Boot项目

文章目录 一&#xff0c;创建Spring Boot项目二&#xff0c;创建控制器三&#xff0c;运行入口类四&#xff0c;访问Web页面五&#xff0c;修改访问映射路径六&#xff0c;利用控制器返回页面1、添加thymeleaf依赖2、准备图片作为静态资源3、创建样式表作为静态资源4、创建首页…

最强Mock 工具,没人反对吧?

背景 在开发过程中&#xff0c;由于后端与前端并行开发&#xff0c;或者前端需要等待后台开发&#xff0c;难以保证对接效率&#xff0c;同时即使用开发好的 API 对接&#xff0c;也有可能一个 API 不通就阻塞了整个软件的对接工作。同时对软件的敏感度也很高&#xff0c;一不…

微软推出 Hierarchical Transformer 实现更高准确率的语音评测

对于语言学习者来说&#xff0c;练习发音并获得及时准确的反馈&#xff0c;是提高口语水平的重要环节。多年来&#xff0c;微软一直深耕基于 Azure 认知服务的语音功能&#xff0c;不断优化语音评测[1]功能的底层技术&#xff0c;从准确率、流畅度、完整性和语音语调等方面&…

Cadence+SPB16.2入门教程(下)

弹出Create Net Class对话框,如图4.21所示。输入名称DDR_DATA,点击OK关闭对话框。 建立DDR_ADDR的过程也一样,同时选中网络XM1ADDR0-XM1ADDR15,XM1CASN、XM1CKE0、XM1CSN0、XM1RASN、XM1WEN后右键Create->Net Class。其它就不重复了。 然后将上一步建立的两个电气规则D…

chatgpt赋能Python-python_ijust

简介 Python ijust&#xff0c;是一款非常优秀的Python代码编辑器&#xff0c;它支持多种语言编程、自动补全、代码高亮、代码片段库和多种主题等众多特性。Python ijust 可以在Windows、macOS、Linux上运行&#xff0c;而且界面简洁、易用。 主要功能 代码高亮&#xff1a;P…

【MySQL新手到通关】第三章 基本的SELECT语句

文章目录 1. SQL 概述1.1 SQL 背景知识 1.2 SQL 分类2. SQL语言的规则与规范2.1 基本规则2.2 注释2.3 数据导入指令 3. 基本的SELECT语句3.1 SELECT ... FROM3.2 列的别名3.3 去除重复行3.4 空值参与运算3.5 着重号 4. 显示表结构5. 基本的过滤数据 1. SQL 概述 1.1 SQL 背景知…

计讯物联打造医疗设备远程质检“新神器”TG453,引领医疗设备数字化浪潮

方案背景 基于物联网的普及与推广&#xff0c;物联网技术在医疗行业得到更广泛的应用。在医院的日常诊疗工作开展中&#xff0c;CT、呼吸机、监护仪、注射泵、核磁共振、DR系统、工频X光机等医疗设备稳定无故障地运行对于医院、患者而言具有重要影响。医疗设备在长期使用过程中…

讨论:为什么越来越多的企业开始搭建属于自己的知识库?

随着信息技术的发展&#xff0c;人们可以在互联网上随时随地获取各种信息。企业作为一个独立的组织体系&#xff0c;其运营和管理需要依赖于大量的知识和信息。因此&#xff0c;建立一个属于自己的知识库&#xff0c;可以帮助企业更好地管理和共享知识&#xff0c;提高员工的工…