3. NULL = 0, EOF = -1,'\0' = 0
5. 合法用户定义标识符:①只能由字母,数字,下划线组成;②第一个字符是字母或下划线;③长度限制63之内;④区分大小写;⑤不能是关键字,可以是预定义标识符(printf,sort之类的)
6. 取模运算只能是整数
7. 非零数表示逻辑真
8. sizeof("hello") = 6,字符串hello的存储空间自动赋值’\0‘
9. int **p[10], p是一个数组
10. printf(%d,"abc"),以整型输出字符串的地址
11. char s[] = "chain"; char *p = s; 问:s数组的大小,和p所指向的字符串长度相等。--不等,字符串的长度计算相当于strlen(),不计'\0'。而数组的大小相当于sizeof(),计入'\0'。
char str[] = "h";
printf("%d",sizeof(str)); //输出2
char str[] = "hello\tworld\n";
printf("%d,%c",sizeof(str),*(str+10))
//输出13,d因为\t输出的时候是按照五个空格输出,但在字符数组中只存储一个位置
'\0'等价0等价NULL,与'0'不相等(他们对应的Ascll不同)
有变量定义 char **pp[10];则以下描述是正确的:pp是一个指针,pp是一个指向字符数组的指针,pp是数组名。
12. NULL在stdio.h中被定义
13. 在ANSI C/C89/C90 TC环境下,char 1; int 2; float 4; 说明:C89是C语言版本号,TC是编译器(比较古老了)
14. char s[10] = "abcd"; 在'\0'后面的数组元素自动被计算机定义为'\0';
上机实验:c语言对定义好,未赋初值的元素不会自动赋值:例如 int i, a[10]; 但是用一种情况会赋值,如:int a[10] = {1}; 你只要赋了一个以上的值,后面会自动被赋值为0;
上机实验:虽然对于局部变量的int i,c语言不会自动赋值,但是对全局变量的int i和静态变量static int i; 计算机自动对其赋值为0;
15. x++, ++表示自增,类似(-x)++,(a*x)++都是错的,
只有 . -> () [] 是爹
++和* - 都是单目,单目从右向左
int a[] = {1,3,5,7,9};
int *c = a+2;
printf("----%d",*c++); //输出5,因为++在后,在赋值语句中,先赋值再++
//此时c指向a + 3
printf("--%d ",*++c); //输出9,因为++在前,先加再赋值
int k,m=1;
k=-m++;
printf("%d",k); //输出-1 ++在后先用后加。
16. 表达式'A'+'B'的类型为int
17. c语言源程序文件后缀名是.c,经编译器编译后生成.obj文件(二进制文件,目标文件,不能运行),后经过连接程序把.obj文件与c语言提供的各种库函数连接起来生成 .exe可执行文件(二进制)
c语言中的非执行语句不会被编译,不会生成二进制指令语言
18. c语言程序算法可以没有输入,但必须要有输出
19. stdout 是文件标准输出流,数据类型是FILE文件类型,用于文件输出函数将内容输出到屏幕上。其头文件stdio.h
20. 指针类型的变量无论是char,int,double,其所占字节数都是8,可以使用sizeof()来测试
#include <stdio.h>
int main() {
char ch = 'A';
FILE *file = stdout;
fputc(ch, file);
return 0;
}
21. c语言创建一个数组
int *A = (int*)malloc(sizeof(int)*n) //创建一个动态数组
int *A = new int[n]; //c++创建
LNode *p = (LNode *)malloc(sizeof(LNode)) //创建一个结点
LNode *B = new LNode; //c++创建
22. 逗号表达式的值,由最后一个表达式决定
x = y = 3 等价于 x = (y=3) 表示先将3复制到y,再将y的值赋值给x
a=2,b=3,c=a+b; 这个表达式的值是5(假设abc已经定义好)
23. \ddd是一个八进制的字符
printf("%d",'\101'); //65
printf("%c",'\101'); //A
八进制首位是0,十六进制首位是0x,0X。八进制输入输出是%o,十六进制输入输出是%x,十进制无符号型输入输出是%u
24. 函数 形参值 的传递
void fun(int *a,int b,int &c){
++*a;
b++;
c++;
}
int main(){
int x=0,y=0,c=0;
fun(&x,y,z);
printf("%d,%d,%d",x,y,z); //x的值会变,y的不变, z的值也会变
}
24. 单目运算符的执行顺序
int x=0,*y=&x;
*y++; //x的值不会变成1,程序会先执行++后执行*,
//这样会使指针y指向下一个地址,但不会改变y的值。
//因此,执行完*y++后,x的值仍然是0。
24. puts和gets头文件是stdio.h,strcpy strcmp strlen 需要头文件string.h
25. %md 左边补空格,double输入%lf,输出%f,float 输出,输出都是%f
%.mf,m位浮点数。
int i = 2;
printf("%3d",i); //输出 2;
float k = 3.111;
printf("&&%0.1f",k); //输出3.1
26. 科学计数法:1e-1,60e3都是合法。0.32e,0.32e0.1,0.32e1前面两个非法,后面一个合法,以为e后面不能没有数,且只能是实数。
float x = -121, y,z,w,m,n;
y = fabs(x); //取绝对值
z = sqrt(y); //取根号
w = pow(y,1); //取y的次幂,一次幂
m = exp(1); //取e的一次幂
n = log(m); //取e的对数
printf("%f,%f,%f,%f,%f",y,z,w,m,n);
27. 二维数组下标
对一个数组:a[3][4] a[2][-2] = a+2*4+(-2) = a+6 合法
对一个数组:a[3][2] a[2][-2] = a+2*2+(-2) = a+2 合法
a[-2][2] = a+2*(-2)+2 = a-2 非法
28. 逆拓扑排序:出度为零的顶点优先出(考点)
注意:要实现拓扑排序,则邻接表不适合,因为每一次删除一个出度为零的顶点,还要删除所有指向它的边,这意味着要遍历所有的结点所以不适合。
反而如果使用邻接矩阵实现,这只需要找到这个被删除结点所在列,将所在列元素设置为零即可
29. 有关字符函数
1. strcpy()
char a[20] = "hello";
strcpy(a,"wo");
printf("%s",a); //返回结果wo 说明strcy在复制字符串到 a 数组中时,
//wo\0都会被一起放到a中。
//注意:strcpy(a,b),a必须是数组,b可以是数组也可以是字符串
2. strcat()
char b[20] = "hello";
char c[20] = "wo";
strcat(b,c);
printf("\n%s",b); //返回结果 hellowo 说明c连接在b的'\0'结束位置。
30. 有关数据类型位数
char是两字节,8位(因为其是大于零,故取值范围是0-255)
31. 常见字符数组定义
正确:
A. char str[] = "abc";
B. char str[10] = "abc"
C. char str[10] = {'a','b','c'}
D. char *p; p = "abc"
错误:
A. char str[10]; str = "abc"; /*解释:第一步定义时,str指向了计算机分配的一块存储区域,
第二步又将str指向了字符串abc的位置。
由于数组的数组名是一个固定的地址,可以看作指针常量,不能随意改变它的值。故错误。*/
B. char str[10] = {"ABCDE"}; //有大括号就别双引号了
32. 打开和关闭文件
r 只读 ;r++打开,读写
w 创立,写;w++创立,读写/覆盖
a 打开,追加;a++打开,读写/追加。
33. 复习文件输入输出函数
34. 平均2月28天,闰年很突出是29天
35. typedef
typedef int (*FP)(); //使用typedef定义一个指向函数的指针类型FP
typedef int ARR[10]; //使用typedef定义一个10个元素的整型数组类型ARR,
ARR a; //再用ARR定义一个10个元素的整型数组a
typedef FILE* FP; //使用typedef 定义一个文件指针FP
36杂
printf(" ","hello"); %u,%s,%x 不会报错,%f会报错
37 命令行参数:argc,
int main(int argc,char* argv[]){
printf("%s",Hello);
printf("%s",argv[1]);
}
//编译连接后,用命令行运行 test word 输出Hello world
并且argc=2 既是数组元素个数