c_数组
数组的特点:c语言中有基本类型和构造类型,数组属于构造类型,结构体也属于构造类型。数组的数据结构特点是,在内存中是连续,用来存放相同数据类型。
本文从一维数组、二维数组、字符数组、数组名、数组越界来介绍。
一维数组 从定义、初始化、元素引用介绍。
定义
[存储类型] 数据类型 合法的标识符[下标(整型的常量表达式或整型常量)]
初始化
1.数组未初始化时,其元素值为随机值。数组在内存中是连续的内存空间。
数组未初始化,其元素值为随机值。
#include <stdio.h> #include <stdlib.h> int main(){ /*数组n未进行初始化*/ int n[3]; int i=0; for(i=0;i<3;i++){ printf("n[%d],value=[%d]\n", i,n[i]); } /*数组m进行初始化*/ int m[3] = {0}; for(i=0;i<3;i++){ printf("m[%d],value=[%d]\n", i,m[i]); } return 0; }
代码输出结果如下,证明了数组元素未初始化时,数组中的值都是随机值。

数组在内存中是连续的内存空间。
#include <stdio.h> #include <stdlib.h> int main(){ int n[3]; int i=0; for(i=0;i<3;i++){ printf("n[%d],address=[%p]\n", i,&n[i]); } return 0; }
代码输出,如下。

其输出结果证明了数组在内存中是连续存储,同时数组未初始化时元素的值在内存中为随机值。
2.数组元素全部初始化,数组元素部分初始化。
(1)数组元素部分初始化举例说明,代码如下。

输出结果,如下。

输出结果说明了,部分初始化是按照数组中元素的存储位置进行赋值的。
(2)通过scanf给数组元素赋值,代码如下。

代码输出结果,如下。

这里有一个小知识点,scanf中如果不指定格式化符号,那么你输入的如空格等会变成分隔符。
3. static定义数组
如果不是static初始化,其类型为auto类型,那么元素的值是随机值。如果是static初始化,即使不给元素初始化,那么元素会被初始化为0。
代码说明,如下。

代码输出结果,如下。

输出结果证明了,static定义数组,数组就会被初始化为0即使对数组不进行初始化。
数组元素引用
对于数组中元素的访问使用的是数组的下标。数组名[下标],下标是从0开始。通过指针也可以进行引用。
数组名 数组名是当前数组的起始位置。
代码举例说明,如下。

代码输出,如下。

从输出结果中我们可以看出,数组名的地址和数组首元素地址的值相同。由此可以看出数组名就是当前数组的首地址即当前数组的起始位置。
2 数组名是一个表示地址的常量,也是数组的起始位置,在程序中定义数组后,不能再使用数组名放在等号左边进行赋值。
数组越界
实际在c语言中,数组取值有一个等式,arr[i] = *(arr+i),即使用指针进行运算并解引用,获取相应地址的值。
下面使用代码,如下。

代码的输出结果如下。

从代码中我们可以看出,数组中有3个元素,其中都初始化赋值了。但是在for循环中,我们循环了四次,也就意味着arr[3]并不是数组的元素。
奇怪的是打印时,其arr[3]却有值,这个值是由地址偏移找到的,arr[i] = *(arr+i)中不管i的值多大,表达式*(arr+i)总是成立,并且能打印出值。
一维数组的练习题
1.求斐波拉契数列的前10项,并在数组中逆序排放。
斐波那契数列的规律为,每个数都是前两个数的相加。
这里编程需要注意数组的下标和元素的位置的关系,也就是说第3个元素其实它对应的下标为2。
#include <stdio.h> #include <stdlib.h> static void fobonacc(){ int fobo[10] = {0}; fobo[0] = 1; fobo[1] = 1; int i = 0; for(i=2;i<10;i++){ fobo[i] = fobo[i-1] + fobo[i-2]; } for(i=0;i<10;i++){ printf("%d ", fobo[i]); } printf("\n"); }
2.数据排序 冒泡排序 选择排序 快速排序
3.进制转换
4.删除法求质数
字符数组的定义、初始化、存储特点。
字符数组的定义
字符数组的初始化
单个字符初始化。
字符串常量初始化。
字符数组的输入、输出。
字符数组的常用函数。
posted on 2020-12-01 23:18 XiaoXiaoli 阅读(189) 评论(0) 收藏 举报
浙公网安备 33010602011771号