概念👏
咋说呢,我个人觉得这部分还是蛮重要的,首先是兴趣其次是压力,前面迷糊咯后面路就会走窄。
它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
创建方式👏
如何创建一个数组呢?如下:
type_t arr_name [const_n];
分为三个部分,type_t是数组的元素类型;arr_name是数组名;const_n是一个常量表达式,用于指定数组的大小。注意这里提及的是常量表达式,那么小朋友你是否有很多疑惑,我可不可以这样写
int a = 3; int re[a];
其实是可以的,但我用的是vs2019编译器,这种情况下会报错“表达式必须是常量”,其实在C99标准之前,是不支持使用变量的,只能是常量,C99中增加了变长数组的概念,允许数组大小是变量,而且要求编译器支持C99标准。特别是vs2019对C99的支持不是很好,语法限制死了,像Linux Centos7等是没有问题的。
初始化👏
创建的同时给一些值就叫初始化。
比如我给几个就创几个: int re[5]={1,2,3,4,5},这就是完全初始化。
那如果我比较懒,创建了10个数,只放了5个进去可以吗?是可以的,这种叫做不完全初始化,效果是剩余的元素默认初始化为 “0”。
我给定了元素但没有创建个数可以吗:int re[]={1,2,3,4,5};这样也是没有任何问题的,它会根据初始化的内容来确定他有几个元素,我们打开调试的监视窗口一目了然:
**PS.**对于如下代码我们需要区分一下:
char re[]={'a',98,'c'}
这个数组看起来是不是感觉有问题?不是说数组是同种类型的元素吗?答案是没有问题的,注意不要忘了ASCII码哦,这里的“98”就等价于“B”。
char re[]="abc"; //re有3个元素,数组大小3个字节 char re2[3]={'a','b','c'}; //re2有4个元素,数组大小4个字节(\0)
使用👏
数组的使用在之前介绍操作符的文章里我就介绍了 : [ ] ,下标引用(访问)操作符,他是用来访问数组元素的,在数组中有一条铁律,数组中的元素下标是从0开始的。
下标访问只能访问一个元素,我可不可以把他所有内容打印出来呢?比如我有一个5个元素的数组,那我只要产生0~4的下标去访问元素就可以了。
int main() { int re[5] = {1,2,3,4,5}; int i = 0; int a = sizeof(re)/sizeof(re[0]);//计算元素个数 for(i=0;i<5;i++) { printf("%d\n",re[i]);//下标不是指定元素大小的,可以是变量 } return0; }
一维数组的存储👏
一维数组在内存中如何存储的呢?我在研究是就把它具象化,看看他的地址:
int main() { int arr[5] = { 1,2,3,4,5 }; int i = 0; for (i = 0; i <= 4; i++) { printf("&arr[%d]-%p\n", i, &arr[i]); } return 0; }
结果如下:
在16进制中 'C’的大小为12,所以不难发现他们的地址都是每两个元素之间相差 4,因为整型大小为 4个字节,一个字节给一个地址,所以得出结论:
1.一维数组在内存中是连续存放的;
2.数组随下标的增长,地址是由低到高变化的;
这个用处还是蛮大的,当我知道数组首元素的时候,就可以全部搞定了
int re[5] = {1,2,3,4,5}; int *p = &re[0]; int i = 0; for(i = 0;i<5;i++) printf("%d ",*(p+i));//逐个全部打印数组内容 return 0;