LinuxC语言中的数组和rand函数和宏定义
文章目录
一、数组也是一种复合数据类型
1.数组的定义
(1)
说明:
- 和结构体成员类似,数组 count 的4个元素的存储空间也是相邻的。
- 结构体成员可以是基本数据类型,也可以是复合数据类型,数组中的元素也是如此。
(2)根据组合规则,我们可以定义一个由4个结构体元素组成的数组:
也可以定义一个包含数组成员的结构体:
2.数组中的元素通过下标(或者叫索引,Index) 来访问。
(1)
3.C语言中后缀运算符的优先级高于前缀运算符
4.数组下标也可以是表达式,但表达式的值必须是整型的
5.数组的初始化
6.定义和访问数组——遍历的使用
7.数组与结构体的显著区别
(1)显著不同在于:
(2)
说明:
- 编译器也不会报错,但这样写并不是传一个数组类型参数的意思。对于数组类型有一条特殊规则:数组类型做右值使用时,自动转换成指向数组首元素的指针。 所以上面的函数调用其实是传一个指针类型的参数,而不是数组类型的参数。
- 接下来的几章里有的函数需要访问数组,我们就把数组定义为全局变量给函数访问。 等以后讲了指针再使用传参的办法。
- 这也解释了为什么数组类型不能相互赋值或初始化,例如上面提到的 a = b 这个表达式, a 和 b 都是数组类型的变量,但是 b 做右值使用,自动转换成指针类型,而左边仍然是数组类型,所以编译器报的错是 error: incompatible types in assignment 。
二、数组的应用例子:统计随机数
1.rand函数介绍
(1)
(2)完整的程序如下:
说明:
- 这里介绍一种新的语法:用 #define 定义一个常量。
-
实际上编译器的工作分为两个阶段,先是预处理(Preprocess) 阶段,然后才是编译阶段,
用 gcc 的 -E 选项可以看到预处理之后、编译之前的程序,例如:
说明:
(i)预处理器的作用: - 一是把头文件 stdio.h 和 stdlib.h 在代码中展开;
- 二是把 #define 定义的标识符 N 替换成它的定义20(在代码中做了三处替换,分别位于数组的定义中和两个函数中) 。
(ii)那么用 #define 定义的常量和第 3 节 “数据类型标志enum”讲的枚举常量有什么区别呢?
- define 不仅用于定义常量,也可以定义更复杂的语法结构,称为宏(Macro) 定义。
- define 定义是在预处理阶段处理的,而枚举是在编译阶段处理的。
(3)
毕竟我们的样本太少了,才20个数,如果样本足够多,比如说100000个数,统计一下其中每个数字出现的次数也许能说明问题。但总不能把100000个数都打印出来然后挨个去数吧?
我们需要写一个函数统计每个数字出现的次数。
完整的程序如下:
说明:
2.习题
三、数组的应用例子:直方图
1.直方图的含义
2.用数组的效率低与效率高的方法比较
(1)效率低的方法:
说明:
(a)
(b)尽管上面的方法可以准确地得到统计结果,但是效率很低,这100000个随机数需要从头到尾检查十遍,每一遍检查只统计一种数字的出现次数。
(2)效率高的方法
说明: