数组在内存中连续排列
1 数组是可以在内存中连续存储多个元素的结构,数组中的
所有元素必须属于相同的数据类型
一维数组声明的基本格式为:
类型 数组名[数组元素个数];
比如,声明语句:
double sz[6];
告诉编译器3条信息:数组名是sz,存放的元素是double型,数组存放的元素个数为6,这样,便可以对数组及数组元素进行读写访问。
要防止下标越界的错误发生,对上面声明的数组sz来说,有效的下标是0到5,在程序中如果出现了sz[6],编译器有时并不会报错,但这可能引起程序的崩溃。
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
sizeof(类型说明符,数组名或表达式);
或sizeof 变量名
因此sizeof(a);则求得 结果为20 。因为一个元素占4个字节,数组a有5个元素,则占有5*4=20个字节
sizeof(int) ;//求得int 类型所占的字节数
printf("\n%x",a); //打印出数组a的地址
分别打印出数组a中的元素的值和地址:
运行结果:
* 一维数组也称向量,用以组织具有一维顺序关系的一组同类型数据,在使用数组前,必须先声明数组,编译器根据声明语句为其分配内存,这样数组才有意义。
* 要在内存中开辟一块连续内存给数组用,需要考虑以下问题,一是在哪里开辟,而是开辟多大的地方,C语言中,这都是由编译器自动完成的 ,编程人员说要做的是“提要求”,即所开辟的数组应能盛放多少个元素,每个元素是什么类型,另外,编程人员还要指定数组名。
2 定义一个数组a,有10个元素
如果越界访问,程序则会崩溃
3 数组定义的形式:
size必须是常量表达式
(1)通过 #define N 20 ,下面的代码是合法的。
如果 printf("%d",&N); //编译器放在常量区,没有地址,无从修改
(2)通过const int num=10; 然后定义数组b[num] 这样的
代码是不合法的
num 在内存中有实体,是可变动数。
4、数组初始化,系统在栈区自动分配一段连续的内存给数组元素
不足的数填充0.
5、数组的其他初始化情况:
补充:
Linux下编写一段代码,用于打印数组a元素的值和地址
通过gcc shuzu.c -std=c99 在c99的模式下编译shuzu.c源文件
打印出数组元素的值和地址
一维数组案例一 逆序输出
1、 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
解题思路:
定义一个长度为10的数组,数组定义为整型
要赋的值是从0到9,可以用循环来赋值
用循环按下标从大到小输出这10个元素
(1)定义一个数组a[10], 通过for循环对数组a的元素进行顺序递增赋值
(2)通过for 递减的方式把 数组中的元素进行逆序输出
注意:数组a[i]下标的循环是a[0]到a[i-1]。
数组解决Fibonacci数列问题
1、 求和、求平均值
(1)定义一个数组a[10],把产生的10个随机数赋值给数组a的10个元素,然后按照顺序打印出数组a的各个元素的值。
运行结果:
随机产生的10个随机数赋值给数组a个各个元素
(2) 通过for循环,把数组中的10个元素累加赋值给变量all,然后把all的值赋值给double类型变量total,然后通过total/=total,进行除法运算。
2、 查找数据是否存在
输入一个值,通过for循环遍历所以的元素与输入的值进行比较。
判断是否找到。
运行程序:
输入要查找的数38,则打印出找到。
3、 斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34……
注意:
0是第0项,不是第一项。
这个数列从第二项开始,每一项都等于前两项之和
F(N)=F(N-1)+F(N-2)
求斐波那契数列的代码
运行结果:
实现了 F(N)=F(N-1)+F(N-2) 的算法
4、求最大值和最小值以及他们所在的下标
随机产生10个数,遍历分配给数组a
一维数组案例
二维数组
设置断点进行调试,二维数组中的元素同样是给分配在一段连续的内存
4、我们进行如图所示的方式对数组a进行初始化
设置断点调试,可以看到二位数组中的所有元素都被初始化为0
5、 初始化表达式中内层花括号代表一行,这样,和一维数组中只能对前几个元素初始化不同,二维数组的初始化可跳过某些中间元素,给后面的元素赋值,在了解了二维数组内存分布后,理解可能更深刻。
设置断点调试,可以看到二位数组中的所有元素在内存中的存储方式
6、 大括号初始化了以后,行号可以省略
7、 二维数组地址的引用 :
元素a[i][j] 的地址是&a[i][j];
二维数组的数组名代表该数组的首地址;
比如 a,实际上就是&a[0][0]。
二维数组元素在内存中按行存放,第1行的首地址为a[0] ,第2行的首地址为a[1] ,......,第n行的首地址为a[n-1]。
&a[i][j]等价于a[i]+j。
(1) 通过嵌套for循环,对二维数组a进行初始化
运行结果:
打印出数组的元素以及数组元素的地址
二维数组案例以及三维数组
运行结果:
杨辉三角形
运行结果如下:
二维数组案例 输出二维平面的死图形并变色
高维数组分析
1、 如果数组是N维,就需要N个下标来访问数组中的元素,同理,在声明高维数组时,除了和一维、二维数组声明一样要制定元素类型和数组名外,还要指定每一维的大小,以帮助编译器确定到底要分配多大的内存块。
举例来说,要声明一个int型3维数组sz,大小为345,
代码如下:int sz[3][4][5];
初始化三维数组
运行结果:
习题