C语言数组
一.数组定义
数组由数据类型相同的一系列元素组成
如
int main(){
float candy[365];
char code[12];
int states[50];
…
}
cnady是包含了365个float元素的数组。code是包含了12个char类型的数组。states包含了50个int类型的数组。
二.数组初始化和取值
我们使用花括号包含值,值之间用逗号分隔。而这些值会一次存储到数组当中,如果没有初始化,值为垃圾值。如果未初始化全部值,剩下的值为0。
而取值,使用数组名加方括号,方括号里面的数字叫数组下标,0代表数组第一个元素。n-1代表数组第n个元素
在这个例子中,我们并没有给num[2]复制,但因为我们初始化了数组的其他值,所以num[2]会自动被赋值0
在这个例子中,因为没有给数组初始化的原因,所以内部存储的都是垃圾值。
三.用const声明数组
有时候需要把数组设置为只读。这样,程序只能从数组中检索值,不能把新值写入数组。要创建只读数组,应该用const声明和初始化数组(不初始化,后面是无法赋值的)
const int num[2] = (1,2};
这样修改后,变量就变为了不可修改的左值程序在运行过程中就不能修改该数组中的内容。
四.指定初始化器(c99)
这是c99增加了一个新特征:指定初始化器,利用该特性可以初始化指定的数组元素。这个初始器除了拥有和普通数组只要初始化一个元素,其他元素的值都为零以外。还有另外两个特性
1.最后面的初始化的值会代替原先元素的值
2.在初始化指定后面的数会赋值到指定赋值后面的位置。
1.[1] = 29,1下标的值在前面被赋值了28。但以最后的初始化为主,所以就算29.如果后面还有指定1的小标的赋值,也会替换当前赋值。
2.[4] = 31,30,31;这里下标4被赋值了31,后面的30,31就会从指定赋值后面的位置开始继续赋值。所以30,31分别被赋值到了下标5和6;
有时候还会遇到特殊的情况,比如未指定元素大小的情况下使用指定初始化器。
从最后的运算结果我们可以得到days一共有7个元素,它是如何计算的,让我们来看下
从这张运算图当中我们可以看到除了3和4元素为零外,有数值的元素一直到7。7以后后面都是垃圾值了,这部分就不算在数组里面了。
从这部分我们也看出来,你的数组要了多少空间,那么你就用多少空间,不要越界使用。
五.二维数组
其实在讲二维数组之前,我们在来说下一维数组。我们从一维,二维来理解它们的不同。一维就是单纯
一条线。而二维就是平面。那么如果我们把一维理解成,在一条线上面存储多条类型相同的数据。那么一个平面也可以由无数条线组合起来。
所以
float rain[5][12] 可以理解为rain是一个内含5个数组元素的数组(一个平面上有5条线),每个数组元素内涵12个float类型的元素(每个线上有12个元素)
而三维就可以想象成多张表单(里面有多条表)。而更高的维度也可以这样理解下去。
按照数据存储的思维也可以把一维数组想象成一行数据,把二维数据想象成数据表,把三维数组现象成一叠数据表
六.初始化二维数组和打印二维数组
我们在打印一维数组的时候用了一个for循环,而如果我们想打印完二维数组元素则要用两个for循环(一个for循环嵌套另外一个for循环)
初始化
首先我们先来看第一个红色下划线
int num[2][3] = { {1,2,3} , {4,5,6} };
num[2]:num是一个内含两个元素的数组
int [3]:一个内含3个int元素的数组。
合并在一起就是一个内涵两个元素的数组,每个数组当中内含3个int元素
初始化的值。外围用一个花括号,内部两个花括号代表num[2],有两个数组,分别对两个数组的三个元素初始化。
这里我使用了两层for循环进行打印
num[i][j]:的意思是打印num第i个数组当中第j个元素
这里在讲一个小知识点。如果花括号的值没有全部初始完后面的值就会全部设为0
我们来反别看下两个相同赋值,但内部不加花括号的情况
num[2][3] = {{1,2},{4,5}};
这个很好理解和我们上面一维数组道理是一样的
num[2][3] = {1,2,4,5};
这里要明白,这些包含三个元素的数组在内存当中是连续存储的。如果我们不加花括号,系统就会自动按顺序赋值。而后面没有赋值的就自动给0。而带花括号其实就是对这个赋值范围进行的限制。
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈