C语言基础——数组

 {\▁/}

 ( / 。\ )

   / ⊃💔\⊃

为什么我那么努力还是得不到那么多赞

011de83bf98740aeade76f216f535e86.gif

          ʕ • ᴥ • ʔ         

 づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员

专栏主页:C语言基础



前言

大家好啊,我们这一章节就来讲讲数组吧,在之前的几个章节我们已经基本上解释了什么是数组(具体可以看我之前的文章:C语言基础——字符串与数组及部分操作符-CSDN博客),这里再简单说明一下吧。我们都知道,如果我们在C语言中想要创建很多个变量,如果是一个一个创建的话那效率太低下了,这个时候或许会有人想到用循环来搞定,但是我们再细想想,如果用循环来表示的话我们应该把这组数据储存在哪里呢,如果只是创建一个变量的话那么后一次循环会覆盖掉前一次循环,但是如果创建很多个变量的话又不好在循环之中插入,这个时候我们便可以使用我们心心念念的数组啦。我们这一章节就来具体看看数组到底是什么吧。


一、数组的概念

数组顾名思义就是存储一组数据的。它是一组相同类型的元素的集合,也就是说数组里的数据肯定是1个及以上,不能等于0;而且数组里的数据肯定都是相同类型的;数组有很多维度,我们这一章先来说说一维数组,二维及以上的我们下一章节再说,我们接下来一起来细看看吧。

二、一维数组的创建及初始化

2.1 一维数组的创建

type arr_name[常量值]

以上是以为数组的基本创建方法:

1. type是类型,也就是变量的类型,可以是像int、char、float、short等内置类型,也可以是自定义类型;

2. arr_name是你想取的数组名,最好起的有点意义,不然到时候看不懂就糟糕了;

3. [这个里面是数组的大小],[]里面一定得是常量,变量是会报错的,而且建议要多少就拿多少,不要浪费。

例如:int iloveyou[10]就是一个存储大小为10整型变量的数组。当然还可以创建其他类型的数组。

char ch [20];     //字符类型数组

double db[20];  //浮点数类型数组

存放数组时我们把存放在数组里的值称之为数组的元素,我们在创建数组时可以指定数组的大小和元素的类型。

9db045e0d084462e92a86bf1cba51138.png

另:监视功能

在继续讲之前我先来和大家说一下vs里面有里面的一个很有用的小功能——监视功能,这个功能可以看到我们的代码运行的方式,我们可以看到我们创建的值有没有按照我们应该的方式去运行,我们一起来看看吧。

首先如果说我们不知道程序有没有问题或者说我们按了ctrl+F5运行成功了却并没有按照我们想要的方式去走怎么办呢?我们可以按F10去一步一步的运行代码去看到底哪里有问题

int main()
{
	int a = 10;
	printf("%d", a);
	return 0;
}

就假如我这个代码有问题,能运行但是却不是我想要的结果,我就可以先按F10来一步一步的调试,但是我又看不到它内部的赋值之类的运行方式怎么办呢,我们就可以用监视功能。

cbb949c8c523438e88d0bc49709dd7df.png

按了F10以后会跳出这个操作台以及箭头,这个就是程序定格在这里等待着下一步,这个时候再按F10程序就会再往下走一行,直至走完,但这上面没有显示监视功能,我们可以这样打开它,cf7880844a7a458f9ed95552ee1f1b7c.png

这四个窗口都可以,看你喜欢

7e10f327350d486a9c2b4bc321ede01e.png

然后就出现了,这个时候我们就可以添加我们要监视的内容,比如说我这里觉得a有问题,我要输出的是20,但是为什么是10,我就可以去看看a是怎么变化的

0ae5779ceef54e64b9723c00ff91fcf3.png

我们在添加监视的项那里去添加a,然后再去一步一步的运行程序,直到程序运行完

7f8c3ab24bc3422caf61575190f79014.png

这里看到了当箭头在第九行时,也就是运行完了第八行时a变成了10,原来是第八行有问题啊,这就是监视的用法。下面初始化的时候再给大家展示展示。

2.2 一维数组的初始化

我们在使用数组的时候,一般都是要在里面赋予一些我们需要的值的,这个时候就要用到我们的数组初始化了,一般数组的初始化都是用{},在{}里面输入我们想要的值。

int arr[5] = { 1, 2, 3, 4, 5 };     // 完全初始化

int arr[5] = { 1 };                     // 不完全初始化

int arr[3] = { 1, 2, 3, 4 };         //错误初始化

初始化一般会有以上的三种情况,首先就是完全初始化,就是说我们要的元素每个都把它初始化了,这就是完全初始化;其次就是不完全初始化,就是没有把我们要的每个元素都初始化,而是初始化一部分,那除了我们初始化的那一部分,其余的没有初始化的部分计算机默认为0;然后就是错误的初始化,就是我们要的元素还没有我们初始化的元素多,所以会出错,我们要多少就初始化多少,不能贪心多初始化哦。

ce6776dae1e245688f4238196ae4216f.png

我们可以看到不完全初始化在未被初始化的部分默认为0。

2.3 数组的类型

小伙伴们可能会想,我们创建的东西一般都是会有一些类型的,那数组的类型是什么呢?

int arr1[10] = { 0 };

int arr2[5] = { 0 };

char ch[5] = { 0 };

以上三个数组的类型分别是什么呢?有的小伙伴们可能会认为像数组名前面的就是数组类型,但实际上是错误的哦,数组名前面的是数组里的元素类型,而不是数组类型,我们思考一下我们原来是这么定义变量的,是不是除了变量名剩下的就是变量类型,其实数组也是如此,以下就是以上3种的数组类型。

int [10];

int [5];

char [5];

就是把数组名删除后剩下的部分,或许有同学还很疑惑,为什么是这样的呢?别急,这里面涉及到指针,我们以后再说明。我们可以看到,数组类型是十分多变的,所以它属于自定义类型变量而不是内置类型。

三、一维数组的使用

以上我们了解到了数组的一些基本语法,接下来我们就来看看数组该如何使用吧。

3.1 一维数组的下标

在C语言当中,数组是有下标的,下标是从0开始的,假如有n个元素,那么下标的末尾就是n-1,下标相当于一个编号,可以用来查找我们指定位置的数组里数据内容。

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

我们可以知道它们其实是这样

a34ef6aa2ddf47df859ee71359f6e822.png

它的下标一定是从0开始的,到n-1,我们可以通过下标来找到我们需要的数据,比如想要找到5,那就找下标是4的数据就可以了。

3.2 一维数组的打印

我们知道,数组之中有这么多数据,我们该证明打印出来呢?这里我们要介绍一个操作符" [ ] ",这个操作符叫做下标引用操作符,它可以引用我们所需要的下标里的数据的内容

int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	printf("%d", arr[3]);

	return 0;
}

这个代码我们就可以打印下标是3,变量名叫做arr的数组的内容,也就是4。

1aa9bbdac34549da8d32fe4d555c8910.png

但是如果我们想都打印出来该怎么做呢,我们之前说过,像这种批量化的操作一般都可以用循环来操作,我们这里也一样,可以试试循环。

int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 由于下标是从0开始,到n-1就是最后一个,所以我们像这样写就可以把数组都输出出来啦。

d06eada9d26d4738b7c8a294f7f5ec90.png

这就是数组的输出方式啦,主要是靠循环来把数组一个一个的输出出来。

3.3 一维数组的输入

一维数组的输入和输出的方式其实大相径庭,也是靠循环来输出

int main()
{
	int arr[5] = { 0 };
	for (int i = 0; i < 5; i++)
	{
		scanf("%d", &arr[i]);
	}

	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

 我们可以看到,这是一个先输入然后再输出的程序,输入本质上也就是一个一个的输入,靠循环来实现的。

9a933fb1e16c43049e544f78dfad7dd8.png

四、一维数组的内存存储

我们知道数组在我们的物理模型是长这样的

9db045e0d084462e92a86bf1cba51138.png

创建一个变量肯定是要在计算机中开辟一个内存空间的,我们数组在创建时它的内存空间是不是也向上图一样是连续的呢,还是说它是断开的呢,我们可以来看看,但是在看之前我要和大家讲一下一些概念,首先,在C语言中%p是专门用来打印地址的;还有一个&操作符,这个是专门用来取地址的,&arr就是取用地址arr;还有就是一般地址是以16进制打印出来,也就是16进1,10用a表示然后以此类推,到15用f表示。同时我们如果使用x64(64位环境)它的地址会比较长,所以这里就使用x86(32位环境)来打印代码。

5fa787c285ef49bda7af10abb0bf6213.png

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

运行这个代码来看看它们的内存是如何存储的吧。

e92186062e4046078a894893e1a15bfd.png

我们可以看到,它们每个地址之间都隔了4个字节(内存的单位是字节,之前讲过哦),难道说它们之间不连续嘛,我们不要忘记啦,这个数组类型所存储的元素都是int整型,int型元素本身是占4个字节的,所以说它在内存中的物理模型如下。

f9ea4a7978534cb6bd7555b778a0c959.png

很显然,一维数组在内存中应该是连续存放的,这对我们后期学指针时有大用,请牢牢记好。

五、sizeof计算数组元素个数

我不知道小伙伴们有没有想过,难道每次输出或者输入时都要去看看到底要输入或者输出多少个元素吗,难道没有一种方法可以自动计算元素的个数,这样就可以直接修改数组而不用去修改其他数据了。当然有,这就是我们之前讲到过的sizeof函数。

我们之前讲sizeof函数,我们都知道sizeof函数的作用是用来计算变量的内存大小,但是这个怎么计算数组元素大小呢?我们知道,数组中的元素类型都是相同的,而且数组类型变量的内存大小是这些数组元素总的内存大小之和,也就是说,我们其实可以用总的元素之和除以一个元素的大小,就可以计算出一个数组中有多少个元素了

元素个数 = sizeof( arr ) / sizeof( arr[ 0 ] );

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

这里我们可以看一下

ae47bdf69f694fb1a0b17a0eae36f6b7.png

可以看出来,成功的计算出了数组之中元素的个数,如果这个时候如果要更改数组后输入或者输出就十分方便了

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

 如果更改数组,就只用直接更改,其他的都不用变。

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

ac56a0270f6f45b6b35dc867f8d62ec7.png

63557d3eb8d94080af4d0d4272befac3.png


总结

本章节讲述了一维数组的基本语法以及如何输入和打印,内容还是比较多的,下一章节我们将会在一维数组的基础上延申出二维数组及以上的内容,感谢小伙伴们的阅读,如果有那里写的不是很对,欢迎指出,谢谢大家。

  • 80
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 41
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值