LinuxC语言中的数组和rand函数和宏定义

一、数组也是一种复合数据类型

1.数组的定义

(1)
LinuxC语言中的数组和rand函数和宏定义
说明:

  • 和结构体成员类似,数组 count 的4个元素的存储空间也是相邻的。
  • 结构体成员可以是基本数据类型,也可以是复合数据类型,数组中的元素也是如此。

(2)根据组合规则,我们可以定义一个由4个结构体元素组成的数组:
LinuxC语言中的数组和rand函数和宏定义
也可以定义一个包含数组成员的结构体:
LinuxC语言中的数组和rand函数和宏定义

2.数组中的元素通过下标(或者叫索引,Index) 来访问。

(1)
LinuxC语言中的数组和rand函数和宏定义
LinuxC语言中的数组和rand函数和宏定义

3.C语言中后缀运算符的优先级高于前缀运算符

LinuxC语言中的数组和rand函数和宏定义

4.数组下标也可以是表达式,但表达式的值必须是整型的

LinuxC语言中的数组和rand函数和宏定义

5.数组的初始化

LinuxC语言中的数组和rand函数和宏定义

6.定义和访问数组——遍历的使用

LinuxC语言中的数组和rand函数和宏定义

7.数组与结构体的显著区别

(1)显著不同在于:
LinuxC语言中的数组和rand函数和宏定义
(2)
LinuxC语言中的数组和rand函数和宏定义
说明:

  • 编译器也不会报错,但这样写并不是传一个数组类型参数的意思。对于数组类型有一条特殊规则:数组类型做右值使用时,自动转换成指向数组首元素的指针。 所以上面的函数调用其实是传一个指针类型的参数,而不是数组类型的参数。
  • 接下来的几章里有的函数需要访问数组,我们就把数组定义为全局变量给函数访问。 等以后讲了指针再使用传参的办法。
  • 这也解释了为什么数组类型不能相互赋值或初始化,例如上面提到的 a = b 这个表达式, a 和 b 都是数组类型的变量,但是 b 做右值使用,自动转换成指针类型,而左边仍然是数组类型,所以编译器报的错是 error: incompatible types in assignment 。

二、数组的应用例子:统计随机数

1.rand函数介绍

(1)
LinuxC语言中的数组和rand函数和宏定义
(2)完整的程序如下:
LinuxC语言中的数组和rand函数和宏定义
说明:

  • 这里介绍一种新的语法:用 #define 定义一个常量。
  • 实际上编译器的工作分为两个阶段,先是预处理(Preprocess) 阶段,然后才是编译阶段,
    用 gcc 的 -E 选项可以看到预处理之后、编译之前的程序,例如:
    LinuxC语言中的数组和rand函数和宏定义
    说明:
    (i)预处理器的作用:
  • 一是把头文件 stdio.h 和 stdlib.h 在代码中展开;
  • 二是把 #define 定义的标识符 N 替换成它的定义20(在代码中做了三处替换,分别位于数组的定义中和两个函数中) 。

(ii)那么用 #define 定义的常量和第 3 节 “数据类型标志enum”讲的枚举常量有什么区别呢?

  • define 不仅用于定义常量,也可以定义更复杂的语法结构,称为宏(Macro) 定义。
  • define 定义是在预处理阶段处理的,而枚举是在编译阶段处理的。
    LinuxC语言中的数组和rand函数和宏定义
    (3)
    LinuxC语言中的数组和rand函数和宏定义
    毕竟我们的样本太少了,才20个数,如果样本足够多,比如说100000个数,统计一下其中每个数字出现的次数也许能说明问题。但总不能把100000个数都打印出来然后挨个去数吧?
    我们需要写一个函数统计每个数字出现的次数。
    完整的程序如下:
    LinuxC语言中的数组和rand函数和宏定义
    说明:
    LinuxC语言中的数组和rand函数和宏定义

2.习题

LinuxC语言中的数组和rand函数和宏定义
LinuxC语言中的数组和rand函数和宏定义

三、数组的应用例子:直方图

1.直方图的含义

LinuxC语言中的数组和rand函数和宏定义

2.用数组的效率低与效率高的方法比较

(1)效率低的方法:
LinuxC语言中的数组和rand函数和宏定义
说明:
(a)
LinuxC语言中的数组和rand函数和宏定义
(b)尽管上面的方法可以准确地得到统计结果,但是效率很低,这100000个随机数需要从头到尾检查十遍,每一遍检查只统计一种数字的出现次数。

(2)效率高的方法
LinuxC语言中的数组和rand函数和宏定义
说明:
LinuxC语言中的数组和rand函数和宏定义
LinuxC语言中的数组和rand函数和宏定义

3.习题