最近在qq群里面水群的时候,看到有群友不是很会用c里面的数组,于是就写下了这篇文章
什么是数组
以下是维基百科的解释
在计算机科学中,数组数据结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址
创建数组
你可以使用数据类型 数组名字[大小];
来创建一个数组
数据类型
可以去看我的 这篇文章
而数组名字
呢就是对这个数组的一个称呼,当我们需要访问或者对数组赋值时,可以通过数组的名字来进行操作
最后大小
就很好理解了,大小
就是可以存放多少个数据类型大小元素
下面我们就来创建数组试试吧:
int iarr[2]; //申请可以容纳 2 个 int 类型的数组
char carr[3]; //申请可以容纳 3 个 char 类型的数组
float farr[7]; //申请可以容纳 7 个 float 类型的数组
访问
我们学会了创建一个数组,可是光是创建可不行呀,这样我们就没法从数组中读取或者存入东西, 那下面我们就来看看数组怎么访问吧。
数组可以通过array_name[index]
来进行访问,
可能有人会问index
是个啥呀,index
翻译成中文就是索引的意思,顾名思义index
就代表着要访问第几个数组元素,请注意index
是从0开始的,那为啥是从0开始而不是1或者其他数字呢,这个问题我们留到文章的结尾再解释
赋值
我们学会了创建和访问数组,下一步就是为数组中的元素赋值了吧
我们可以使用 array_name[index] = value
来对数组的第index
个元素进行赋值,就像这样:
int iarr[10];
iarr[0] = 1;
当然,你也可以在数组创建的时候进行赋值,like this:
int iarr[10] = {0,1};
这就等价于下面这种方式:
int iarr[10];
iarr[0] = 0;
iarr[1] = 1;
同时,你可以不设定数组的长度,让编译器自动设定,像这样:
int iarr[] = {0,1,2,3,4,5,6,7}
此时数组的长度为8
深入理解
不完整的数组类型
不完整的数组类型属于不完整类型(incomplete type),即缺乏信息去确定其尺寸。例如:
extern int a[]; // 外部变量声明
void foo(int b[]) {} // 函数形参
void bar(int b[][10]) {} // 多维数组形参
int a[] = { 10, 20 }; // 初始化
柔性数组成员
C99标准规定,struct的最后一个成员可以是不完整的数组类型。例如:
struct test {
int a;
short b;
char c[];
};
数组的本质
数组的本质就是一个指针,而创建数组就是为数组分配一个数组长度*数组数据类型大小
的连续的内存空间,并将指针指向这片空间的第一个元素。
而数组的类型则是代表存放每个数组元素的内存空间大小,例如创建这样一个int
数组
int iarr[10] = {1,2,3,4};
此时数组在内存里所占的大小是10*sizeof(int)
,而iarr是一个指向数组第一个元素的指针,这篇文章的读者你知道什么是指针吗,如果不知道的话,请看这里
我们可以利用如下代码测试
printf("%d\n", *iarr); //out 1
printf("%d\n", *(iarr+1)); //out 2
printf("%d\n", *(iarr+2)); //out 3
我们注意到iarr是一个指向数组第一个元素的指针,而且数组的index
是从0
开始,那我们不妨大胆猜想,其实对一个数组进行访问就是对iarr+index
这个指针指向的内存地址进行访问,接着就是写代码测试一下
printf("%d\n", iarr[0]) //out 1
printf("%d\n", 0[iarr]) //out 1
唔......是相同的输出呢,看来我们的猜想是正确的,看到这里也就解释了为什么c的数组的索引是从0
开始而不是1
好啦,这篇文章结束啦
请期待一下我的下一篇文章吧