最近在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

好啦,这篇文章结束啦

请期待一下我的下一篇文章吧