C语言基础之——数组

news2024/11/19 12:42:30

前言:本篇文章,我们将对一维数组,和二维数组进行展开式的讲解,并进行实际应用。

目录

一.一维数组

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

(1)数组的创建

(2)数组的初始化

 2.一维数组的使用

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

二.二维数组

1.二维数组的创建与初始化

(1)数组的创建

(2)数组的初始化

 2.二维数组的使用

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

三.总结


一.一维数组

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

数组是一组相同类型元素的集合。

(1)数组的创建

创建方式:

type_t        arr_name[const_n];

type_t         是数组的元素类型

[const_n]         是一个常量或常量表达式,用来指定数组的大小

例如我们创建int类型和char类型的数组: 

int arr1[5];

int arr2[2+3];

char arr3[10];

[ ]内一定要是一个常量或者常量表达式。那么我们再来看一个数组创建:

int a = 5;

int arr[a];

上述数组的创建可以被允许吗???事实上这牵扯到C语言的版本问题。

C99之前,数组的大小只能用常量指定,但是在C99之后引用了变长数组的概念,数组的大小便可以用变量来指定了。

但是博主现在所使用的VS2019,以及VS2022都是不支持变长数组的

(2)数组的初始化

初始化是指,在数组创建的同时给数组输入一些合理的初始值。 

int arr[5];//已知数组大小时,可以只创建而不初始化

int arr1[10] = {1,2,3};//不完全初始化,剩余元素默认初始化为0

int arr2[] = {1,2,3,4};//创建大小未知的数组时,必须初始化,默认大小为元素个数

int arr3[5] = {1,2,3,4,5};//规范初始化,元素个数与数组大小一致

char arr4[3] = {'a',98,'c'};//字符初始化要用单引号,如果给的是数字,则存在数组里的实际是数字所对应的ASCII码值所对应的字符,例如98对应字符'b',所以实际存进数组的是字符'b'

char arr5[] = {'a','b','c'};//常规字符初始化,不满同样补0

char arr6[] = "abcdef";//直接输入字符串时,用双引号

如上,数组的初始化化有很多种方法,其中值得注意的是,arr5和arr6两种字符数组的初始化,其中arr5是单个字符的输入,arr6是字符串整体的输入,这样arr6便会比arr5多输入一个'\0'。

 2.一维数组的使用

对数组的操作,则是通过下标引用操作符 '[ ]' 来实现。

如上图我们可以看到,数组中元素的实际顺序是从0开始的,也就是说,假如我们要操作数组的第5个元素,那就要用arr[4],而这个'4'我们则称为是数组元素的下标

这里我们定义了一个char型的数组,char型数组也可以接收数字,只不过是想要打印出数字就必须用到'%d'

 如果我们想把数组的全部元素打印出来,只需要用到for循环

循环打印数组元素时,这里有一个陷阱,那就是我们的循环变量'i'是数字元素的下标,而数组元素的下标是元素的实际顺序减1,所以这里的'i'要从0开始,并且到9结束,所以限制条件是i < 10,而不是i <= 10否则就会打印出多余的错误的结果,造成数组越界

 同时我们也可以通过数组元素下标来对其值进行修改:

 如上,我们将'5'改成'1'

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

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

这里给大家补充一个小知识点,当我们要打印一个数据所存放的地址时,要用到'%p'。

 由此我们可以看出,随着数组下标的增长,元素的地址也在有规律的增长,每个地址直接相差4个字节,而这正是一个int型数据所占用的字节数。因此我们可以得出结论:

数组在内存中是连续存放的

二.二维数组

二维数组与一维数组的区别并不大,下面我们就来具体介绍一下二维数组。

1.二维数组的创建与初始化

(1)数组的创建

int arr[3][4];

char arr[4][5];

double arr[5][6];

如果一维数组只是一条直线,那么二维数组就是一个矩形,第一个[]代表行,第二个[]代表列

(2)数组的初始化

int arr[3][4] = {1,2,3,4,5,6,7};//不完全初始化,会根据行数列数依次填充,不满补0

int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//不规范初始化

int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//规范初始化,每一行用一个大括号

int arr3[3][4] = {{1},{2,3},{4,5,6}};//不完全初始化,每一行空缺的位置补0

int arr4[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//省略行数初始化,会根据{}数来默认行数

int arr5[3][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//省略列数初始化,不允许,会报错

 2.二维数组的使用

二维数组的使用同样是通过下标。

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

假如我们要打印这个二维数组的元素12,那么我们就要找到它所在的位置,如下图所示为2行3列 

 那么如果我们要遍历整个数组又该怎么办呢???

很简单,只需要用到嵌套循环便可:

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

外层循环来控制行数内层循环来控制列数,这样便可以轻松实现二维数组的遍历,如果我们希望打印出来的格式为3行,那么我们就要在内层循环结束时输出一个'\n'来换行

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

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

我们同一维数组一样来看看二维数组是怎么在内存中存储的:

 我们能够看出,二维数组的元素存储在内存中也是连续的,每一行的末尾与下一行的开头相连

事实确实如此,小伙伴们可不要理所当然的以为二维数组在内存中就是分行存放的,分行只是我们想象中的二维数组的具象化,但其实在内存中并不是。

二维数组的元素同样也是随着下标的增长,内存不断增加

三.总结

数组的讲解到这里就要结束啦,喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

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

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

相关文章

全行业线上商城系统一体化平台,个性化设计-免费更新-亿发

移动互联网成为了现代人生活中不可或缺的一部分。人们已经习惯了通过手机应用完成日常任务&#xff0c;从购物到社交&#xff0c;都能在手指间直接搞定。 随着小程序的兴起&#xff0c;2023年的线上商城系统在不断发展的数字化环境中&#xff0c;如今&#xff0c;线上商城正以…

行业报告 | 2023人工智能发展白皮书

原创 | 文 BFT机器人 在科技日新月异的今天&#xff0c;人工智能已成为最具革命性的技术之一&#xff0c;有望对人类社会生活产生显著的影响。过去几年&#xff0c;人工智能相关理论研究技术创新、软硬件升级等整体推进&#xff0c;极大地促进了人工智能行业的发展。 进入2022…

【BurpSuite常用功能介绍】

BurpSuite的使用 1.运行BurpSuite 2.代理设置 打开软件后&#xff0c;我们第一件事就应该去调试软件和浏览器的代理&#xff0c;让BURP能够正常工作抓包 proxy--options&#xff0c;我端口默认使用8080 然后我们打开一个浏览器&#xff0c;进入代理设置 (注意一点&#xff0…

JAVA switch case 穿透问题

1&#xff0c;前提 其实开发中很少会用到switch &#xff0c;一般更倾向于if-else&#xff0c; 但是最近接手的项目&#xff0c;前人写的代码都用switch &#xff0c; 但是我一直以来对switch 的理解就跟if一样&#xff0c; 然后项目运用的时候才发现这玩意居然还有穿透问题 …

python 模块openpyxl 读取写入.xlsx文件

Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。下面是各个模块的支持情况&#xff1a; xlrd&#xff1a;xlrd 读取.xls文件xlwings&#xff1a;xlwings 读取写入Excel文件xlwt&#xff1a;xlwt 写入.xls文件 一、…

Springboot集成RocketMQ——简单使用

目录 1.MQ选型 2.RocketMQ基本架构 3.Springboot集成RocketMQ 4.顺序消息 5.延时消息 6.事务消息 1.MQ选型 目前市面上的MQ选型&#xff1a;主要分为3个类型 Kafka&#xff1a;吞吐量大&#xff0c;且性能好&#xff0c;集群高可用&#xff1b;会丢失数据&#xff0c;功…

Linux安装FileBrowser(简洁版)

项目简介安装目录 mkdir -p /opt/filebrowser/data && cd /opt/filebrowser 安装包下载 wget https://github.com/filebrowser/filebrowser/releases/download/v2.24.2/linux-amd64-filebrowser.tar.gz 注意&#xff1a;https://github.com/filebrowser/filebrowser/re…

Django(5)-视图函数和模板渲染

Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」 在我们的投票应用中&#xff0c;我们需要下列几个视图&#xff1a; 问题索引页——展示最近的几个投票问题。 问题详情页——展示某个投票的问题和不带结果的选项列表。 问题结果页——展示某个投票的结果。 投…

vr内容编辑软件降低了虚拟现实项目开发门槛

VR虚拟场景编辑器是一种专门用于创建、修改和设计虚拟场景的工具。它利用vr虚拟现实技术&#xff0c;让用户可以在三维空间中直接对场景进行操作和编辑。这种编辑器的出现&#xff0c;使得用户可以更加直观、自由地进行场景设计和制作&#xff0c;为诸多领域带来了新的可能性。…

Qt串口通信学习文档

这是官方文档&#xff0c;我也在学习。 QSerialPort Class | Qt Serial Port 5.15.14https://doc.qt.io/qt-5/qserialport.html

AIGC 图表可视化案例实操

AIGC ChatGPT 对于职场办公提高办公效率那是肯定的。例如做数据分析与可视化如下图&#xff1a; 做这样的一个图表可视化分析&#xff0c;我们会用到HTML &#xff0c;JS&#xff0c;Echarts。 但是代码测试起来&#xff0c;与调试比较费时间&#xff0c;所以我们可以让AIGC …

前端需要理解的跨平台知识

混合开发是指使用多种开发模开发App的一种开发模式&#xff0c;涉及到两大类技术&#xff1a;原生 Native、Web H5。原生 Native 主要指 iOS&#xff08;Objective C&#xff09;、Android&#xff08;Java&#xff09;&#xff0c;原生开发效率较低&#xff0c;开发完成需要重…

Metasploit提权

一、bypassuac 用户账户控制&#xff08;User Account Control&#xff0c;简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权&#xff0c;以达到帮助阻止恶意程序&#xff08;有时也…

编写c语言程序调用openssl编译出的动态链接库

文章目录 一、编译生成链接库二、示例一&#xff1a;调用RAND_bytes函数三、示例二&#xff1a;调用SHA256 一、编译生成链接库 下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了&#xff1a;Ubuntu中安装OpenSSL 此外&#xff0c;我们还需要提前了解…

Android studio之GridView使用

目录 效果图&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/86e4a48a71164dec82613d58b1fbaa1c.jpeg)代码&#xff1a; 效果图&#xff1a; 代码&#xff1a; UserGridviewAdapter package com.example.gridviewpro.Adapter;import android.content.Contex…

Python练习 函数取列表最小数

练习2&#xff1a;构造一个功能函数&#xff0c;可以解决如下问题&#xff1a; 要求如下&#xff1a; 1&#xff0c;任意输入一个列表&#xff0c;函数可以打印出列表中最小的那个数&#xff0c; 例&#xff1a;输入: 23,56,67,4,17,9 最小数是 &#xff1a;4 方法一: #内置函…

AURIX TriCore内核架构学习笔记

名词缩写 ISA - Instruction Set Architecture&#xff0c;指令集架构PC - Program Counter, holds the address of the instruction that is currently runningGPRs - 32 General Purpose RegistersPSW - Program Status WordPCXI - Previous Context InformationCSA - Conte…

C语言练习2(巩固提升)

C语言练习2 选择题 前言 “志之所趋&#xff0c;无远弗届&#xff0c;穷山距海&#xff0c;不能限也。”对想做爱做的事要敢试敢为&#xff0c;努力从无到有、从小到大&#xff0c;把理想变为现实。要敢于做先锋&#xff0c;而不做过客、当看客&#xff0c;让创新成为青春远航的…

word电子报刊制作过程

随之网络的迅猛发展&#xff0c;利用计算机排版技术编辑制作电子报刊也很普及了。这里教大家如何将WODR转换成翻页的电子报刊 我们可以使用FLBOOK制作电子报刊&#xff0c;操作很简单 1.搜索FLBOOK制作电子杂志平台 2.点击登录与注册&#xff0c;可支持QQ、微信登录 3.现在点击…

Unity中的数学基础——贝塞尔曲线

一&#xff1a;前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn&#xff0c;n1为线性&#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点&#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值&#xff08; Mathf.Lerp&#xff09…