变量/结构体类型
-
自带变量类型
- int:绝对值在 1 0 9 10^9 109范围内可以使用int类型
- long long:绝对值在 1 0 18 10^{18} 1018内可以使用long long类型,对long long赋大于 2 31 − 1 2^{31}-1 231−1的初值需要在初值后加LL
- float,double:float有效精度在7位,double有效精度在15位;在print中float和double都是使用%f输出
- 小写字母的ASCII比大写字母的大32
- 字符串常量可以作为初值赋给字符数组,但不能非初值用字符串常量赋值
-
结构体类型
- 结构体内可以定义自身类型的指针变量(如结点的定义),但不能定义自身(循环定义)
- 构造函数建议使用前面带下划线的变量名,如"_id",以区分自身变量和传入变量
- 定义了人为构造函数后默认构造函数消失,不能不经过初始化定义变量(需要自己定义默认构造函数)
- 结构体内可以定义变量类型和函数,与class的区别是结构体内东西都是public的,不能继承等
输入与输出
- scanf,printf:scanf的%c格式可以读入空格和换行,scanf参数是地址,printf参数是值
- 输出格式:%md使int变量以m位右对齐,%0md使int变量以补零右对齐,%.mf使浮点数保留m位小数输出
- getchar和putchar:可接收/输出任何字符
- gets和puts:可输入/输出一行字符串,gets以\n作为输入结束,puts以\0作为输出结束
- sscanf(str,"%d",&n)和sprintf(str,"%d",n)可将字符数组转化为数字和将数字转化为字符数组
数组
- 在全局定义的数组,不人为初始化也会初始化为0
- Z维数组赋初值,对前面的元素赋值后,后面的元素默认赋值为0
- 申请的数组较大(大概 1 0 6 10^6 106)时,需要在主函数外部定义
- 字符数组在最后面有\0表明字符串结束。单独读入字符放到字符数组时,注意要在末尾加\0
函数参数传递
- 数组传参:fun(int a[][5])实际上是地址传参
- 指针传参:指针传参实际还是传值,因此不能通过交换指针交换两个数(可以通过指针的引用int* &p实现)
- 引用:引用是给原变量起了个别名(因此函数参数名和变量名可以不同),对引用的操作就是对原变量的操作;常量不可用使用引用,例如不可用写swap(&a,&b),必须先用指针变量存放再传入函数参数。
指针
- 指针是一个unsigned类型的整数
- 定义多个指针采用int *p1,*p2,p3的方式而不是int p1,p2
- 必须要先使指针指向某个某个元素的地址,才能访问指针对应的元素,否则会访问/修改野区引起错误
其他
- typedef:给复杂的数据类型起一个别名
- 宏定义函数每个变量都需要加括号,因为宏定义是直接对应部分的替换
头文件
-
math.h
- 基本操作类:fabs(double x),floor(double x),ceil(double x),round(double x)
- 基本函数类:pow(double r,double p),sqrt(double x),log(double x),sin(double x),asin(double x)
-
string.h
- memset(数组名,值,sizeof(数组名)):连续区域按字节赋值。可对int数组赋值0或者-1,对double数组赋值0
- fill:
- 字符数组基本函数:strlen(字符数组),strcmp(字符数组)(使用与0比较,而不能使用==判断),strcpy(字符数组),strcat(字符数组)
-
stdlib.h和time.h
- 随机数:先srand((unsigned)time(NULL));初始化种子,再使用rand()获得[0,RAND_MAX]范围内的随机数。
- 使用rand()%(b-a+1)+a可获得[a,b]范围内的随机数,线性比例扩大可获得更大范围的随机数。