rand()函数需要的头文件是:<stdlib.h>
rand() 伪随机队列 得手动设置种子 但设置后还是伪随机
用srand()设置种子
设置种子后,再调用rand()函数,实现随机
time(),无参数时,默认存储到默认指针内,如果传入空指针,则返回 无符号整数的当前时间
time()需要包含<time.h>头文件
srand(time(0));种子一直在变 实现了真正随机
可以写成srand((unsigned)(time(0))) 为了可读性 不然是隐式转换
for()循环内三个表达式都可以省略,但;一个都不能省,如果第二个表达式省略,则默认为真,无限循环。
goto可以在函数内任意的跳转!函数内!!!!goto可用来进行错误处理和跳出外层循环。
栈是由高地址向低地址生长的。每次调用会生成一个栈帧
条件运算符
三目运算符 ?:
e1?e2:e3;
数组
数组是如何划分为大小相等的空间的,为什么要这么做?
存放同一类型的元素,为了实现随机访问。
数组下标为何从0开始?
若数组下标从1开始 则地址=首地址+(i-1)*sizeof(elemtype) i-1没有直接用i效率高
或者直接首地址处空着不用 两种都会导致资源的浪费
因此从0开始。
为什么一般来说数组的效率优于链表?
数组可以更好的利用CPU缓存机制 数组->空间局部性 可以直接在高速缓存中访问
链表不仅需要存取数据,还需要存指针域
数组初始化
数组大小应该在编译期间能够确定。
a[10]={1,2} 后面元素,自动赋值为0; 如果括号内值的数量大于数组大小,则出错。
#define Size(a) (sizeof(a)/sizeof(a[]))
二维数组
实际中,按行优先存储。
二维数组本质是:元素是一维数组的数组。
int a[3][4]={{1,2,3,4},{2,2}};其余会自动清0
int a[3][4]={1,2,3,4} 会按顺序依次填充 不推荐 可读性差
int a[3][4]={0}; 全部清0
int a[][4]; 列不能省略
数组的长度,编译器可以推算,但元素类型不可以。a[1]和a[2]不是同一类型。
int a[][]={{1,2},{2,4}}; 错误,二维数组本质,必须得确定数组里存储什么类型的数据 。
常量数组
const a[] 里面的元素不可更改
函数
数学上的函数必须有参数,必须有返回值,但不会造成副作用
C语言上的函数可以没有参数,可以没有返回值,但可能会造成副作用
函数的定义
返回值类型 函数名(参数列表) { 语句}
参数的传递(C语言里只有值传递)
想保留值的更改,应该传入指针。
当数组指针作为参数传递时,会退化为指针,指向数组第一个元素的指针。
缺点:丢失了类型信息,丢失了数组长度。优点:可以避免大量复制数据,否则会复制整个数组。//可以修改原数组的元素,调用也更加灵活,可以传递进去一个比数组长度小的值,对他们进行处理。
能否把一个列数不固定的数组 传入参数
一个一维数组 每个元素是一个指针 每个指针指向一个一维数组
传递一个指针数组 即数组里存放的元素类型是指针
int* a[];
C语言中 返回值类型不能是数组类型
程序如何终止
操作系统调用main 就是进程的开始
main函数返回时,就标示着程序的终止。
如何不在main函数中,终止程序? exit(退出状态码)函数; 状态码=0,表示正常退出,其他值都表示异常退出。
EXIT_SUCCESS 宏 等价为0
EXIT—FAIL 等价为1
局部变量和外部变量
这俩变量的属性:作用域 、存储期限
局部变量:定义在函数内的变量。
作用域:块作用域,{ }从变量定义开始,到块末位。
存储期限:默认为自动存储期限,如果加了static则变为静态存储期限
外部变量:定义在函数外的变量。
作用域:文件作用域,从变量定义开始,到文件末尾。
存储期限:静态存储期限
自动存储期限:存放在栈里面的数据,变量的生命周期随着栈帧的开始而开始,随着栈帧的消亡而终止。
静态存储期限:拥有永久的存储单元,在程序的整个执行期间一直存在。
如foo(void)
{
static int i=0;
printf("%d,%p",i++,&i);
foo();
}打印出来的数据只会是i 因为从头到尾都是一个变量 。
数据段和代码段的数据拥有静态存储期限,栈里的有自动存储期限。堆里的数据需要程序员自己管理。