【落羽的落羽 C语言篇】数组

文章目录

  • 一、数组的概念
  • 二、一维数组
    • 1. 创建、初始化、类型
    • 2. 数组的下标
    • 3. 数组的输入
    • 4. 计算数组元素个数
  • 三、二维数组
    • 1. 多维数组的概念
    • 2. 二维数组的创建与初始化
    • 3. 二维数组的下标
    • 4. 二维数组的输入和输出
  • 四、变长数组
  • 五、数组练习

一、数组的概念

数组的概念是:一组相同类型元素的集合

其中值得注意的是:

  • 数组中存放至少一个元素,不能是0个
  • 数组中存放的所有数据,类型是相同的

数组一般分为一维数组多维数组,多维数组中常用的是二维数组

二、一维数组

1. 创建、初始化、类型

一维数组创建的基本语法为:

type name[常量值]

type为数组中存放数据的类型,也就是数组的类型,比如 int,float,char 等。
name是数组的名字,可以根据实际情况任起。
[ ]中的常量值是用来规定数组大小的,一般会根据实际需求决定。

如果只是这么写的话也可以,代价是数组中所有数据一开始默认都是0,所以有时候我们需要对它进行初始化,可以使用大括号并将数据写在里面。

int arr[5] = {1,2,3,4,5};
  • 当{ }里的元素个数不到[ ]里规定的个数时,系统还会把剩下的空缺部分初始化为0。
  • 如果{ }里已经写定了几个数据,那么[ ]里就可以不用写东西,数组的大小就是写定数据的个数
int arr[] = {1,2,3,4,5};
//与上面等价

而数组的类型,就是指它的元素类型和大小,比如上面的数组 arr ,它的类型就是 int [5]
再比如,创建一个数组:char arr2[10];,它的类型就是 char [10]

2. 数组的下标

C语言规定了数组是有下标的,它相当于数组中每个元素的编号,从0到 n-1(n是数组元素的个数)
比如创建一个数组char arr[5] = {'a','b','c','d','e'};就有:

数据元素abcde
下标01234

有了下标,我们就能访问数组中的某个特定元素了,比如我们想打印出这个数组中的字符c,它的下标是2,就可以写成:

#include<stdio.h>
int main()
{
char arr[5] = {'a','b','c','d','e'};
printf("%c\n", arr[2]);

return 0;
}

在这里插入图片描述而假如想打印出这个数组中的所有数据,怎么办呢
乂~~循环语句嘛

#include<stdio.h>
int main()
{
char arr[5] = {'a','b','c','d','e'};
for(int i=0 ; i<=4 ; i++)
printf("%c ", arr[i]);
printf("\n");

return 0;
}

在这里插入图片描述非常好理解叭!

在这里插入图片描述

3. 数组的输入

明白了数组的下标和访问,我们也可以根据具体需求,给数组输入想要的数据

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

在这里插入图片描述

4. 计算数组元素个数

在遍历数组时,我们有时会需要知道数组中的元素个数,怎么做到呢?我们可以使用 sizeof
sizeof 是C语言中的一个关键字,可以计算类型、变量、数组的大小

举个栗子

#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}

运行后屏幕上会打印出40—— int 类型的数据会占4个字节的内存,arr 中有十个 int 元素,就是40个字节了。

又因为数组中所有元素类型都是相同的,所以我们只要算出数组所占的总内存,除以该类型的数据应占的内存,不正是这个数组里的元素个数了吗?

#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
//arr的总内存除以下标为0的元素的内存
printf("%d\n", sz);
return 0;
}

结果是10

听懂掌声
在这里插入图片描述

三、二维数组

1. 多维数组的概念

前面我们了解了一维数组,如果把一维数组作为数组的元素,这就是二维数组。如果把二维数组作为数组的元素,这就是三维数组…二维数组以上的数组统称为多维数组
(有点像绕口令)
你可以这么想象:在一维数组中,元素依次排成了一条直线。在二维数组中,有若干条这样的直线并排,形成了若干列。
一维数组:

12345

二维数组:

12345
12345
12345

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

二维数组创建的基本语法为:

type name[常量值1][常量值2]

type 和 name 的含义同上
常量值1表示数组的行数
常量值2表示数组的列数

12345
12345
12345

比如这个数组,就是[3][5]

在创建二维数组时,同样也要进行初始化,使用{ },但会有更多复杂情况:

  • 完全初始化:
int arr[3][5] = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};
12345
12345
12345
  • 不完全初始化:
int arr[3][5] = {1,2,3};
12300
00000
00000
  • 按照行初始化:
int arr[3][5] = {{1,2,3},{1,2,3},{1,2,3}};
12300
12300
12300
  • 初始化时可以省略行,但不能省略列
int arr[][5] = {{1,2,3},{1,2,3},{1,2,3}};
12300
12300
12300

3. 二维数组的下标

二维数组也有下标。对于每行,从0到 n-1(n是列数)。对于每列,从0到 m-1(m是行数)
比如我们创建一个数组char arr[3][3] = {'a','b','c','d','e','f','g','h','i'};
就有:

012
0abc
1def
2ghi

这样就很明了了,arr[1][2]是 f,arr[2][0]是 g

4. 二维数组的输入和输出

访问整个一维数组,我们借助了一层循环。同理,访问整个二维数组时,我们可以借助两层循环。举个栗子,我们想输入15个数字,储存到一个三行五列的数组中并打印出来,可以写成:

#include <stdio.h>
 int main()
 {
 int arr[3][5] = {0};
 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;
 }

在这里插入图片描述在这里插入图片描述

tip:除了以上内容,我们还应该知道:数组(包括一维、二维)中的数据在内存中是连续存放的。后期学习指针时会用到

四、变长数组

在C99标准出来前,C语言在创建数组时,数组大小的指定只能用常量表达式。有时候我们事先不知道需要的数组大小,组大了可能会浪费空间,组小了可能又不够用。而C99给出了一个叫变长数组(VLA)的新特性,允许我们用变量指定数组大小。
比如int arr[n],arr 就是一个变长数组,编译器没办法事先知道 n 的值,只有开始运行后通过上面的某些代码确定 n 是多少。所以说,变长数组不能初始化。它的好处是我们不必在一开始就估计数组的大小,而是在程序运行时为数组分配好精确的大小。
不过,数组的大小一旦确定就不能再改变了,所以“变长数组”其实不能“变长”(乐)

可惜的是,VS2022还不能支持变长数组,目前我也不知道为什么o(╥﹏╥)o。大家想去测试的话,可以去gcc编译器等平台尝试,这里我就不演示了~(偷懒)
在这里插入图片描述

五、数组练习

说了这么多,来个栗子尝尝吧:
演示多个字符从左右两端移动,向中间移动
思路:设置变量 l r 作为下标,循环替换两边的字符

#include<stdio.h>
int main()
{
char arr1[] = "I LOVE ACGN";//要出现的字符
char arr2[] = "###########";//要被替换掉的字符
int l = 0;
int r = strlen(arr1)-1;
while(l<=r)
{
Sleep(1000);//让程序“睡”1000毫秒(一秒)再执行
arr2[l] = arr1[l];
arr2[r] = arr1[r];
l++;
r--;
printf("%s\n",arr2);
}
return 0;
}

在这里插入图片描述
本篇完,感谢阅读
下篇预告:函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值