数组
数组也是C语言中的重要组成部分,那么引入数组到底是用来干啥的呢?我们发现阿,你在定义某种数据类型的东西的时候,你都要先写上数据类型+变量名,如果你要定义很多很多的话,你就必须把每一个的变量名都写在数据类型后面,这样就很不方便了,所以数组就出现了。数组就可以一次性定义一组类型相同的东西。
说清楚点些,数组就是一组具有相同数据类型的数据的有序集合。数组有分为很多种,有一维数组,二维数组等等等,但是其实后面的不管几维数组都是在一维数组的基础上去变化。所以今天就来说说一维数组。
一维数组
第一步我们要知道怎么去定义一个一维数组
元素类型 数组名 [元素个数]
元素类型:这个元素类型可不是指数组的类型,而是指数组里面的东东的类型,比如基本1类型,指针类型,构造类型这些。
数组名:也就就是标识符
元素个数:这个元素个数你可以直接写一个常量表达式或者常量来表明到底多少个元素,你也可以隐含指定它有多少个,什么是隐含指定呢?就是虽然你没有说得很清楚,但是计算机可以推断出来到底是多少。
为什么这个元素个数必须要写得那么清楚呢?因为在你定义一个数组的时候,你就要为这个数组在内存块上面去开辟一个空间,你有多少就开辟多少,所以你在一开始就要说清楚。
类型也是个要注意的地方,我来拿两个例子就能很好的看出来
int a[10] ;//定义了一个数组,名为a ,里面有10个int类型的元素.
//a 是一个含有 10个int类型的元素 数组
typeof(a) : int[10]
int a[4] = {1,2,3,4,};
//定义了一个数组,名为a ,里面有4个int类型的元素
//而且这四个元素的初始值 : 1,2,3,4
typeof(a) : int[4]
typeof(a[0]) : int
typeof(a[1]) : int
a[0],a[1],a[2],..,a[9] 就是一个普通的的int类型的变量.
我们发现阿,数组也是有类型的,它的类型这么去描述呢?就是元素的数据类型+[元素的个数],而里面的元素的类型就是在定义数组时写的类型。
数组元素的引用
数组元素的下标是从0开始的,比如int a[2],这里面一共有三个整型元素,分别是a0,a1,a2,这个别搞错了,它一样的也有左值右值的分别,然后就是在输入的时候,scanf(“%d”,&a[0]),你是一个个去输入的,scanf("%d",&a),这样不是一次性输入三个数,而是错的,你想一次输完,要么你就用循环,元素较少的呢你就scanf("%d%d%d",&a[0]&a[1]&a[2])这样也ok,同样的你打印数组也一般使用循环。
一维数组在内存中的存放
最开始的时候就说了,数组是一个有序的东西,为什么说它有序咧,它在储存元素的时候,开辟的空间是连续开辟的,而且一定是先a[0],a[1]这样按照顺序开辟下去并且存放数据的,我们来看下面这段代码
#include<stdio.h>
int main()
{
int h [3];
printf("%p\n",&h[0]);
printf("%p\n",&h[1]);
printf("%p\n",&h[2]);
printf("%p",&h);
return 0;
}
/*[Running] cd "d:\C的复习之路\第七天\" && gcc 数组的地址.c -o 数组的地址 && "d:\C的复习之路\第七天\"数组的地址
000000000061FE14
000000000061FE18
000000000061FE1C
000000000061FE14
[Done] exited with code=0 in 0.875 seconds*/
我们看见运行结果,这三个地址都是相邻的差了四个字节,因为一个int要占据四个字节。我们还发现阿,这整个数组的地址就是首元素的地址,也就是说我们可以通过第一个元素的地址去找到整个数组。如果我们在输出h[3]的地址会发生什么呢?要知道我们h[3]没用去开辟,但是如果你去输出的话它还是会给你一个地址 ,我试了多次,发现给的地址都是相同的,所以虽然你没有这个东西,但是你非要去用系统就会给你一个默认的地址?
数组的初始化
初始化也就是赋值的一个过程,赋值主要分为三大情况:
1、在定义的时候直接对数组整体赋值
int h [3] = {1,2,3}
上面那样就叫在定义时整体赋值,整体赋值也只有在定义时才可以实现,如果错过定义时,就不能整体赋值了,比如:
int p [3];
p = {1,2,3};
这么写就是错的
2、只给部分赋值
int h [3] = {1};
这样也算完成了数组的初始化,虽然它只给了h[0]一个初始值,但是由于你在定义数组的时候就已经开辟了三个空间了,所以其他两个a[1],a[2],虽然你没有给他们俩值,系统还是会赋予默认的0给他们,所以printf(“%d%d”,a[1]a[2])就会输出两个0.从这里也就可以看出来你可以先不对数组赋初值,在后面需要的时候再用scanf去操作。
3、不写元素个数,只赋值
这种就是我们前面在说定义数组时的隐含指定了,
int h [] ={1,2,3,4},虽然一开始没用说明数组h的大小,但是从我们赋予的初值,计算机可以推算出这个数组的大小,从而去开辟空间,这就是隐含指定。
留下一个输入输出数组的代码
#include<stdio.h>
int main()
{
int i;
int max,min;
int h [10];
for(i = 0;i<10;i++)
{
scanf("%d",&h[i]);
}
for(i = 0;i<10;i++)
{
printf("%d",h[i]);
}
max = h[0];
min = h[0];
for(i = 0;i<10;i++)
{
if(max<h[i])
max = h[i];
}
for(i = 0;i<10;i++)
{
if(min>h[i])
min = h[i];
}
printf("\n%d\n",max);
printf("%d\n",min);
return 0;
}
本文详细介绍了C语言中的一维数组,包括数组的概念、定义方式、内存存储、初始化以及数组元素的引用。数组是一组具有相同数据类型的数据的有序集合,其元素在内存中按顺序连续存储。文章通过实例展示了数组的定义、初始化过程,并提供了输入输出数组的代码示例。同时,讨论了数组元素的下标从0开始,以及未初始化的数组元素会默认赋予0的特性。
1万+

被折叠的 条评论
为什么被折叠?



