第五章 2 数组



数组在内存中连续排列

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];
初始化三维数组

运行结果:

习题





原文地址:https://www.cnblogs.com/xingkongcanghai/p/10411388.html