第一次学c语言系列之——数组!!!

数组是指用来存放一个以上相同元素的集合,分为一维数组,二维数组,三维数组,四维……这篇文章我们主要介绍一维数组和二维数组。

一、一维数组

(1)基本语法

数据类型 数组名[数组的元素个数];

数组的创建,就像下面这个代码一样,这就是一个一维数组:
 

int a[];

一般我们创建一个一维数组后都会对他进行初始化

int a[3] = {1,2,3};
int b[3] = {1,2};

像上面这样就叫做对数组进行初始化,后面的花括号表示该数组的几个元素分别是什么。第一个数组a[3]被称为完全初始化(3个元素全设满了。对于完全初始化[ ]里面的数字可以去掉,编译器会自动补全),第二个数组b[3]被称为不完全初始化(3个元素没有被设满),你没有设出来的元素编译器默认是0

(2)一维数组的类型

int a[5] = {1,2,3,4,5};

、、、、、、、、我们拿上面这个数组举例,千万不要错误的认为该数组是int类型,这个int是指数组里面元素的类型。我们的数组是自定义类型(去掉数组名和等于号后面那一串的玩意),也就是int [5]。

(3)一维数组的使用

①下标

c语言中规定数组是有下标,默认从0开始。

int a[3] = {1,2,3};
            0 1 2

②一维数组元素的打印和输入

有了下标,就更方便我们对数组的元素进行打印和输入。

Ⅰ.打印

有了下标之后我们就可以根据数据的下标从而打印出你想要的元素,这里,如果我们元素多了,一个个打印是不是太过于麻烦了,所以我们可以用for循环来解决这个问题,如下图所示。

Ⅱ.输入后打印

这里我们可能会产生一个疑惑,我的第1个元素不是0吗,为什么这里打印出来出来确是1,这是因为我第0个元素输入的是1,它自动把我原来的元素给覆盖了。

(4)sizeof的使用

在前面的文章中,我们提到过sizeof,在这里它的使用方法是一样的,就是看占的内存是多少字节。

其中,第一个printf打印的是第三个元素2所占的内存为4,第二个printf打印的是这5个元素总共占的内存是20。

(5)一维数组在内存中的存储

在这里,我们打印一下元素1-5,对它进行观察(复习一下打印存储地址用%p,&是取地址操作符)

观察这个代码,我们可以发现一维数组的存储时连续的。我们观察这段代码的执行结果就可以发现它的末尾每次增加4字节,一直往前推进。(这是电脑默认的16进制的存储,如8到c就是进了4位)。

二、二维数组

(1)基本语法

数据类型 数组名[行数][列数]

同一维数组一样,我们先来看它的创建和初始化:

①二维数组的创建

int a[2][4];

这一步就叫做数组的创建,这就是一个2行4列的二维数组。

②二维数组的初始化

下来是二维数组的初始化。相较于一维数组,它除了不完全初始化和完全初始化外,还有按照行初始化,下面我们通过代码逐个讲解:

Ⅰ.完全初始化
int a[2][4] = {1,1,1,1 2,2,2,2};
1 1 1 1
2 2 2 2

与一维数组相同,完全初始化就是你设满了。第一行代码就是这个2行4列数组的完全初始化,下面就是它具体的样子。

:我们可以把它的每一行都看做一个一维数组。

Ⅱ.不完全初始化
int a[2][4] = {0};
0 0 0 0
0 0 0 0
int b[2][4] = {1,2,3,4,5};
1 2 3 4
5 0 0 0

与一维数组相同,不完全初始化就是没有设满。不管是我上面的数组a[2][4]还是数组b[2][4]都是不完全初始化,没有初始化的地方默认为0。

Ⅲ.按照行初始化
int a[2][4] = {{1,1,1,1},{2,2,2,2}};//行初始化中的完全初始化
1 1 1 1
2 2 2 2
int b[2][4] = {{1,2},{3,4}};//行初始化中的不完全初始化,依旧补0
1 2 0 0
3 4 0 0

上面的代码就展示了什么是按照行初始化,很简单就是加上一个花括号。目的是让我们看起来更清晰。

(2)二维数组的类型

int a[2][4] = {0};  //类型为int a[2][4]

这里和一维数组没有任何区别,都是去掉数组名和等号后面的玩意。

注:在二维数组里 ,列可以省略,行不能省略。原因也很简单,你行要是省略了,计算机都不知道该咋填数字。

(3)二维数组的使用

①下标

int a[2][4] = {{1,2,3,4},{5,6,7,8}};
//下标  0 1 2 3
    0   1 2 3 4
    1   5 6 7 8

相较于一维数组,我们的二维数组既有行又有列,所以就有两个下标来锁定它某个元素的位置。比如对于上面这个二维数组,我们想要打印5这个元素,就可以这么操作:

②打印

同样,我们用for循环打印出这个数组的全部元素,和一维数组不同的是它既有行又有列,所以这里要用两次for循环。

③输出后再打印

那么怎么实现先输出后打印,这里我们只需要加上一个scanf即可。(对于原数组我们可以重新初始化,也可以不初始化,因为它的值都会被我们新输入的数字覆盖)

(4)sizeof的使用

这里是和一维数组相同的,我们看一下代码就行了。

(5)二维数组在内存中的存储

在这里,我们观察它的存储会发现每一个都差4个字节。所以二维数组的存储也是连续的,不要想当然的认为我的第一列存在一个地址,第二例在另一个地址。

三、C99中的变长数组

int a[3+2];
int b[2][3+2];

什么是变长数组,我们之前的创建数组时,不管是一维数组还是二维数组,都是用的常数(也可以使用常量表达式)。而在我们C99的标准以后,可以用变量来表示,但是有两个点我们需要注意:一个是变长数组不能初始化,另一个是数组一旦创建后,大小就不能再改变了。(VS2022这个编译器不支持变长数组 ,我们可以用其它编译器试试)

int b = 5;
int a[b];

四、小练习:多个字符串由两边像中间汇聚

(1)实现的效果

(2)拆分

我们来拆分这个问题,我们如何实现这个效果呢,首先我们需要2个数组,一个是Welcome to Beijing!!!,另一个是和它元素数量相同的空格,然后左边和右边同时一次替换一个空格即可,最后我们不止要替换一次,这不最后用循环就解决了吗。

①需要两个数组

#include <stdio.h>
int main() {
	char a[] = "Welcome to Beijing!!!";
	char b[] = "                     ";
}

这里,我们可能会有一个疑惑,我的char不是字符型吗,你这不是字符串吗,而且按照语法你为什么没有输入花括号呢。按照我们语法的思路,我们应该这样输入:

但是这个看着实在是太长了,所以为了简洁我们C语言中就规定了它可以写成char a[] = "Welcome to Beijing!!!";

②左下标锁定W,右下标锁定! 

在这一步中,我们通过锁定坐标来改变了数组b的内容,其中在求取数组a长度时-1,这是因为我们求数组a的长度是从1开始的,而我们的下标是从0开始的,下一步,我们直接将它改成循环即可达成想要的效果。

③设置循环

这样就成功得到了我们想要的效果。

④代码的优化

a.我们发现这个代码运行的速度是特别快,刷一下就全部出来了,我们可以通过Sleep这个库函数,要包含头文件windows.h来减缓它的速度(单位是毫秒)。

b.第二个优化点是我们可不可以让它在一行出现,循环一次就删除掉,然后直接开始下一次循环的内容,直到结束。我们可以通过system("cls")这个函数实现,同样,需要包含头文件stdlib.h。

c.第三个优化点,我们可以不可运行一次让电脑响一次。我们可以通过\a这个转义字符来实现,只需要在printf后面加上就行,最后,所有的代码奉上。

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main() {
    char a[] = "Welcome to Beijing!!!";
    char b[] = "                     ";
    int left = 0;
    int right = strlen(a) - 1;
    for (left = 0, right = strlen(a) - 1; left <= right; left++, right--) {
        b[left] = a[left];
        b[right] = a[right];
        printf("%s\a\n", b);
        Sleep(1000);
        system("cls");
    }
    printf("%s\n", b);
}

五、结语

下一篇文章我们将进入函数的学习。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值