数组介绍及其基本情况

前言:

我的小友们,好久不见了,你是否对我以保有一定的期待呢,今天我来了!今天我们来聊一聊数组,在之前我们学习了变量,包括整型,浮点型,布尔类型,字符型.....但毕竟变量的存储空间有限,由此我们又有了今天的数组。

1.数组的概念

数组即为保存一批相同类型的元素(大量),即为变量的集合

注:①数组中的数据类型类型应该一样,用于处理大批量的相同类型的数据

②数组中存放的是一个或多个数据(即数组的长度),但在数组中的元素个数不可为0③数组为内存中连续的储存空间

而数组又根据其容量分为一维数组与多维数组,其中多维数组最常见的就是二维数组。

存放在数组中的数据称为数组的元素。

2.一维数组

2.1创建数组

语法结构:数据类型 数组名 [数组长度](名词之间都用空格隔开)

注:①数据类型可以为基本数据类型,亦可以是自定义的数据类型

②此处的数据类型也要符合用户名标识符命名规则

③数组长度(元素个数),是一个常数,变量是一次性分布的内存(即在定义后内除空间无法改变(变长数组也不可))

(补充知识:在C99标准以前,数组的长度只能通过常量来指定,不可用变量。注:区分于在访问数组的元素的时候,可用变量来表示其下标 eg:num[i]在C99标准出来后,即可用变量来表示数组的长度,即变长数组(后面我们会细说)

2.2数组的初始化

注:数据的创建并非初始化

数据在创建的时候,给定一些出事的值,即为数据的初始化

主要分为这几种:

//完全初始化:int arr[5]={1,2,3,4,5};(数组长度=初始化的元数个数)
//不完全初始化:int arr[5]={1,2,3};(数组长度<初始化的元数个数)
//错误初始化(数据溢出):int arr[2]={1,2,3,4,5};(数组长度>初始化的元数个数)

数据在初始化的时候可以省略【】中的数字eg:num[]={1..2.3}

由于数组的大小是编译器根据初始化的内容来确定的,即此时默认数组长度为3

其实初始化的目的即为存储数据

注:①数据初始化时的数组长度≤数组的长度,不足的部分在初始化的时候会被赋值为0

②且有限的数据为从前往后依次对数据进行初始化

③在多存入数据的时候,会报错,数据溢出

④开始初始化后其后方至少有一个初始化的值,不可不写            

2.3数组的类型

数组的类型区分于变量的类型,数组的类型为去掉数组名留下的部分

数据类型相同,但数组长度不同,数组的类型也不同

2.4数组的使用(调用)

一维数据的初始化实现了存储大量的数据,但存放数据的目的即为对数据的操作。

2.4.1数组的下标

在C语言中,我们通过下标来访问数组中的数据。

下标(相当于数组中元素的编号)是从零开始的,若有n个元素,那么最后一个元素的下标记为:n-1

在C语言中数组的分为提供了一个操作符[],下标引用操作符

我们可以用:数组名[n],来访问数组中的第n项元素,也可以用来表示数组中的一个元素

注:这种形式只用于数组中元素的调用,不会改变数组中元素本身的数值

2.4.2数组元素的打印

我们在数组中保存大量的数据,当我们想看一下里面的的具体内容时,可以用以下的方式。

思路:我们通过数组的下标来调用数组,要是我们能用循环语句来打印其下标,那么之后就就可以对数据进行访问了。

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7.8};
int i=0;
for(i=0;i<=7;i++}
{
printf("%d",arr[i]);
}
return 0;
}
2.5数据的输入

使用arr[i],我们可以用来表示数组中的一个元素。

而数组中的一个元素,本质上就是一个变量,那么数组的输入也可以使用相同的方式来进行。

在这里数组的输入即可为对数组全体都赋值,同时也可以只对其中一个元素进行赋值。

①对全体赋值

如:

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

②在对元素进行赋值的时候,一次只能对一个元素进行赋值

注:数组元素不为数组再用scanf进行输入的时候,要加上取地址符号。

int i=0;
//产生0~9下标
for(i=0;i<=9;i++}
//可根据自己需求进行赋值
{
scanf("%d",arr[i]);
}
2.6一维数组在内存中的存储

我们依次打印数组中元素的地址:

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

输出结果: 

 

根据十六进制的计法,我们发现各个元素之间恰好相差4个字节。(一个整型变量的大小即为4个字节),由此我们可以推出,数组中的各个元素,在内存中是连续储存的。

2.6sizeof计算数组元素的个数

sizeof是C语言中的一个关键字,是可以用来计算类型和变量的大小的,但也可以计算数组的空间大小。

如:①sizeof(int);用于计算某一类型的大小(即一个这种类型的数据在内存中所占的空间)

②int a=0; sizeof(a);就是计算变量a说储存数据的大小

注:①在用于计算数组的大小时,计算的为其所占的空间位置的大小,而非数组中元素的个数

②此处的括号不能省略

sizeof的返回值为(计算结果)size_t,其本质为无符号整型(/长整型)

打印使用“%zd”(部分的IDE环境中)/“%d“这个转义字符来表示

下面我们就来看一下计算数组长度的方法:

sizeof(数组名【即为数组的首地址】)/sizeof(arr[0])(即数组的总大小/单个元素的大小=数组的长度)

这种方法:不论数组如和变化这个表达式都能实时的得出数组中元素的个数

在32位,和64位的开发环境下,int类型的大小均为4字节

3.二维数组

一维数组的定义为大量相同类型的变量构成了一位数组,那么自然二维数组的定义即为:把一维数组(同类型的)当作数组元素时,就是二维数组

3.1二维数组的创建

当我们了解了二维数组的概念,那我们也不妨来了解一下,二维数组的创建方式:

数据类型 数组名[常量1][常量2]

常量1为行数,常量2为列数(其实二位数组就是以其行数为数组长度的一个个一维数组组成的)

3.2二位数组的初始化

二维数组看似”二维“但当其在初始化的时候也是,用大括号来实现的

//不完全初始化
int arr[2][4]={2,2,5,3,5}//规则:先填满一行所需要的元素个数,再填充下一行。不够的用0来补
//完全初始化
int arr[2][2]={1,2,3,4}

补充内容:①但其实还存在另外一种初始化的形式——按照行初始化

二维数组的每一行都是一维数组,在不完全初始化的时候,可以用”{}“把一行的数据给括起来。

②初始化的时候可以省略行数,但不能省略列数。计算机可通过列数来划分行。

3.3二维数组的使用
3.3.1二维数组的下标

二维数组的访问也是采用下标形式的,二维数组有行和列,当我们锁定了行和列,那么这个元素就被唯一确定了。

注:数组元素的下标,从左到右递增,从上到下递增

3.3.2二维数组的输入与输出

二维数组的下标我们已经了解了,那么我们如何才能访问整个数组中的元素呢?

其实我们只用按一定顺序来产生二维数组的所有下标就可以了

#include <stdio.h>
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;
}
3.4二维数组在内存中的储存方式
像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。代码如下:
#include <stdio.h>
int main()
{
 int arr[3][5] = { 0 };
 int i = 0;
 int j = 0;
 for (i = 0; i < 3; i++)
 {
 for (j = 0; j < 5; j++)
 {
 printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
 }
 }
 return 0;
}

从这里的输出结果来看,每一行内部的四个元素都是相邻的,地址之间相差4个字节,跨行处的两个元素之间相差的也是4个字节 ,由此我们可以推出二维数组和一维数组一样,也是在内存中占据了一个连续的存储空间

前四个0的行数均为0,那么可以用arr[0]来代表这一行,但是我们也可以把它看作是一个一维数组。一维数组中我们用数组名 【下标】来访问某一元素,那么在二维数组中我们也可以通过同样的方式来访问一行的内容!!

4.变长数组(C99中)

在C99标准以前,C语言在创建数组的时候,数组的大小只能用常量,常量表达式,或者当我们初始化数据的时候可以省略掉数组的长度。

这样的语法限制,让我们在创建数组的时候不够灵活,有时数组大了浪费空间,有时数组小了又不够用。

为解决这个问题,在C99当中我们提出了变长数组的概念,允许我们使用变量来指定数组的大小

注:变长数组的数组大小,取决与变量的大小,故编译器无法实现确定变长数组的数组大小。

变长数组的根本特征就是只有在运行的时候他的空间才被确定,由此程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可以在运⾏时为数组分配精确的⻓度。有 ⼀个比较迷惑的点,变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。数组的⼤⼩⼀旦确定就不能再变化了。

遗憾的是在VS2022上,虽然⽀持⼤部分C99的语法,没有⽀持C99中的变⻓数组,没法测试;

结语

今天的内容就到这里了,下一期我会为大家带来数组的应用实例哟,敬请期待~~

点赞,收藏,关注❤❤

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小比特newer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值