第五章 2 数组

1589120-20190221110821220-575883749.png
1589120-20190221111817906-590522808.png
数组在内存中连续排列

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的地址
1589120-20190221112529824-1034542723.png
分别打印出数组a中的元素的值和地址:
1589120-20190221112554098-1012841659.png
运行结果:
1589120-20190221112644684-101700238.png

 * 一维数组也称向量,用以组织具有一维顺序关系的一组同类型数据,在使用数组前,必须先声明数组,编译器根据声明语句为其分配内存,这样数组才有意义。
 * 要在内存中开辟一块连续内存给数组用,需要考虑以下问题,一是在哪里开辟,而是开辟多大的地方,C语言中,这都是由编译器自动完成的 ,编程人员说要做的是“提要求”,即所开辟的数组应能盛放多少个元素,每个元素是什么类型,另外,编程人员还要指定数组名。

2 定义一个数组a,有10个元素

如果越界访问,程序则会崩溃

1589120-20190221112822419-1026341857.png

3 数组定义的形式:

size必须是常量表达式
1589120-20190221112919385-214278254.png
(1)通过 #define N 20 ,下面的代码是合法的。
1589120-20190221113005541-953675188.png
如果 printf("%d",&N); //编译器放在常量区,没有地址,无从修改
(2)通过const int num=10; 然后定义数组b[num] 这样的
代码是不合法的
1589120-20190221113040606-19366798.png
num 在内存中有实体,是可变动数。

4、数组初始化,系统在栈区自动分配一段连续的内存给数组元素

1589120-20190221113129878-1559049671.png
不足的数填充0.
1589120-20190221113154892-370316733.png

5、数组的其他初始化情况:

1589120-20190221113224071-525295600.png

补充:

Linux下编写一段代码,用于打印数组a元素的值和地址
1589120-20190221163614228-1360397149.png
通过gcc shuzu.c -std=c99 在c99的模式下编译shuzu.c源文件
打印出数组元素的值和地址
1589120-20190221163737370-1293899905.png

一维数组案例一 逆序输出

1、  对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

 解题思路:
 定义一个长度为10的数组,数组定义为整型
 要赋的值是从0到9,可以用循环来赋值
 用循环按下标从大到小输出这10个元素
(1)定义一个数组a[10], 通过for循环对数组a的元素进行顺序递增赋值
1589120-20190221164011273-599768009.png
1589120-20190221164023999-942972415.png
(2)通过for 递减的方式把 数组中的元素进行逆序输出

 注意:数组a[i]下标的循环是a[0]到a[i-1]。

1589120-20190221164052305-1373536894.png

1589120-20190221164111291-991265429.png

数组解决Fibonacci数列问题

1、 求和、求平均值

(1)定义一个数组a[10],把产生的10个随机数赋值给数组a的10个元素,然后按照顺序打印出数组a的各个元素的值。
1589120-20190221164232386-1825578723.png
运行结果:
随机产生的10个随机数赋值给数组a个各个元素
1589120-20190221164251652-332036654.png
(2) 通过for循环,把数组中的10个元素累加赋值给变量all,然后把all的值赋值给double类型变量total,然后通过total/=total,进行除法运算。
1589120-20190221164315312-2081349522.png
1589120-20190221164413271-363256619.png
2、 查找数据是否存在

输入一个值,通过for循环遍历所以的元素与输入的值进行比较。
判断是否找到。
1589120-20190221164437992-2006768488.png
运行程序:

输入要查找的数38,则打印出找到。
1589120-20190221164504754-1215044413.png
3、 斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34……

  注意: 
   0是第0项,不是第一项。
  
这个数列从第二项开始,每一项都等于前两项之和

F(N)=F(N-1)+F(N-2)

求斐波那契数列的代码
1589120-20190221164542498-672010030.png
1589120-20190221164555620-1828734479.png

运行结果:

    实现了 F(N)=F(N-1)+F(N-2) 的算法

1589120-20190221164616733-678576370.png
4、求最大值和最小值以及他们所在的下标

    随机产生10个数,遍历分配给数组a

1589120-20190221164643872-341327072.png
1589120-20190221164714027-1373580897.png
1589120-20190221164733074-2043719504.png
1589120-20190221164747680-1346874140.png

一维数组案例

1589120-20190221164840787-336110063.png
1589120-20190221164858206-1474701875.png
1589120-20190221164911127-642003726.png
1589120-20190221164930468-1569047244.png
1589120-20190221164944374-2050629692.png

二维数组

1589120-20190221165029784-705859087.png
1589120-20190221165048440-677585965.png
1589120-20190221165101889-315880740.png
1589120-20190221165119112-858285799.png
1589120-20190221165136762-1103609064.png
1589120-20190221165152461-1374282750.png
设置断点进行调试,二维数组中的元素同样是给分配在一段连续的内存
1589120-20190221165225276-994212199.png
4、我们进行如图所示的方式对数组a进行初始化
1589120-20190221165250396-1207741426.png
设置断点调试,可以看到二位数组中的所有元素都被初始化为0
1589120-20190221165312214-347092917.png
5、 初始化表达式中内层花括号代表一行,这样,和一维数组中只能对前几个元素初始化不同,二维数组的初始化可跳过某些中间元素,给后面的元素赋值,在了解了二维数组内存分布后,理解可能更深刻。
1589120-20190221165334003-1917965853.png
设置断点调试,可以看到二位数组中的所有元素在内存中的存储方式
1589120-20190221165354849-1819247516.png
6、 大括号初始化了以后,行号可以省略
1589120-20190221165416746-1549441751.png
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进行初始化
1589120-20190221165442228-1152659602.png
运行结果:

      打印出数组的元素以及数组元素的地址

1589120-20190221165459275-599910587.png
1589120-20190221165511955-141529034.png
1589120-20190221165526014-2087485313.png

二维数组案例以及三维数组

1589120-20190221165608601-195216536.png
1589120-20190221165628054-339860697.png
1589120-20190221165638208-1033488271.png
1589120-20190221165655953-644065177.png
1589120-20190221165707164-292135955.png
1589120-20190221165720741-64727909.png
1589120-20190221165732900-191054215.png
1589120-20190221165751599-1379593888.png
1589120-20190221165802758-593153949.png
1589120-20190221165813809-667246328.png
1589120-20190221165832705-227086345.png
1589120-20190221165845633-729723014.png
运行结果:
1589120-20190221165916041-1494028862.png

杨辉三角形

1589120-20190221170030614-775246119.png
1589120-20190221170047790-559031520.png
1589120-20190221170107052-484458899.png
1589120-20190221170132921-718356867.png
运行结果如下:
1589120-20190221170157088-1424864919.png

二维数组案例 输出二维平面的死图形并变色

1589120-20190221170242883-1769383655.png
1589120-20190221170254067-1284676558.png
1589120-20190221170305637-1827384250.png
1589120-20190221170321249-1569656018.png
1589120-20190221170332843-1762927026.png

高维数组分析

1、 如果数组是N维,就需要N个下标来访问数组中的元素,同理,在声明高维数组时,除了和一维、二维数组声明一样要制定元素类型和数组名外,还要指定每一维的大小,以帮助编译器确定到底要分配多大的内存块。

举例来说,要声明一个int型3维数组sz,大小为345,
代码如下:int sz[3][4][5];
初始化三维数组
1589120-20190221170439752-1387880803.png
运行结果:
1589120-20190221170500813-2121253294.png
1589120-20190221170510922-850391671.png

习题

1589120-20190221170547130-1473797155.png
1589120-20190221170604110-1102761263.png
1589120-20190221170619202-951987203.png
1589120-20190221170644548-575633830.png
1589120-20190221170817531-1201289475.png

转载于:https://www.cnblogs.com/xingkongcanghai/p/10411388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值