1. 数组的基本概念
count
的4个元素的
存储空间也是相邻的
。结构体成员可以是基本数据类型,也可以是复合数据类型,数组中的元素也是如此。根据组合规则,我们可以定义一个由4个结构体元素组成的数组:
count[-1]
或是
count[100]
这样的访问越界错误,编译时能顺利通过,所以属于运行时错误。但有时候这种错误很隐蔽,发生访问越界时程序可能并不会立即崩溃,而执行到后面某个正确的语句时却有可能突然崩溃(在
第4节 “段错误”
我们会看到这样的例子)。
count[-1]
这种技巧其实并不少见,不应该当作错误。)
a = b
这个表达式,
a
和
b
都是数组类型的变量,但是
b
做右值使用,自动转换成指针类型,而左边仍然是数组类型,所以编译器报的错是
error: incompatible types in assignment
。
{
int array1[10] = { 3, 5, 1, 2, 2, 9, 1, 3, 4, 8 };
int array2[10];
int i;
for (i = 0; i < 10; i++) {
array2[i] = array1[i];
}
for (i = 0; i < 10; i++) {
printf("%d, ", array2[i]);
}
return 0;
}
rand
函数,使用这个函数需要包含头文件
stdlib.h
,它没有参数,返回值是一个介于0和
RAND_MAX
之间的接近均匀分布的整数。
RAND_MAX
是该头文件中定义的一个常量,在不同的平台上有不同的取值,但可以肯定它是一个非常大的整数。
srand
函数指定Seed。通常我们通过别的途径得到一个不确定的数作为Seed,例如调用
time
函数得到当前系统时间距1970年1月1日00:00:00的秒数,然后传给
srand
:
rand
,得到的随机数就和刚才完全不同了。调用
time
函数需要包含头文件
time.h
,这里的
NULL
表示空指针。
rand
函数生成[10, 20]之间的随机整数,表达式应该怎么写?
main
函数,以可视化的形式打印直方图。
{
gen_random(UPPER);
int i, histogram[UPPER] = {0};
for (i = 0; i < N; i++)
histogram[a[i]]++;
for (i = 0; i < UPPER; i++)
printf("%d\t", i);
printf("\n");
do {
// 实际上只可能循环N次,因此外层while循环可改为for 0-> N-1,变量breakLoop也可以省了
int breakLoop = 1;
for (i = 0; i < UPPER; i++) {
if (histogram[i] > 0) {
printf("%c\t", '*');
histogram[i]--;
breakLoop = 0;
} else {
}
printf("\n");
if (breakLoop)
break;
} while (1);
return 0;
}
N
个数中取
M
个数做组合而不是做排列,就不能用原来的递归过程了,想想组合的递归过程应该怎么描述,编程实现它。
'\0'
做结束符,这里的
\0
是ASCII码的八进制表示,也就是ASCII码为0的Null字符,在C语言中这种字符串也称为以零结尾的字符串(Null-terminated String)。数组元素可以通过数组名加下标的方式访问,而字符串字面值也可以像数组名一样使用,可以加下标访问其中的字符:
printf
会从数组
str
的开头一直打印到Null字符为止,Null字符本身是Non-printable字符,不打印。
str
中没有Null字符,那么
printf
函数就会访问数组越界,后果可能会很诡异:有时候打印出乱码,有时候看起来没错误,有时候引起程序崩溃。
图8.3.多维数组
图8.4.多维字符数组
case
、
printf
和
break
,如果漏写一个
break
就要出Bug。这个程序之所以简洁,是因为用数据代替了代码。具体来说,
通过下标访问字符串组成的数组可以代替一堆
case
分支判断,这样就可以把每个
case
里重复的代码(
printf
调用)提取出来
,从而又一次达到了“提取公因式”的效果。这种方法称为数据驱动的编程(Data-driven Programming),写代码最重要的是选择正确的数据结构来组织信息,设计控制流程和算法尚在其次,只要数据结构选择得正确,其它代码自然而然就变得容易理解和维护了,就像这里的
printf
自然而然就被提取出来了。
(man - computer + 4) % 3 - 1
这个神奇的表达式是如何比较出0、1、2这三个数字在“剪刀石头布”意义上的大小的?