一. 快速上手
1. 逻辑上删除一段程序:
#if 0
statements
#endif
2. printf函数:%d十进制整型值、%o八进制、%x十六进制、%g浮点值、%c字符、%s字符串
scanf函数:%d整型值、%ld长整型、%f浮点数、%lf双精度、%c字符、%s字符串
3. char *strchr(char* dest, char src) => 返回src字符在dest字符串中第一次出现的位置
char *strstr(char* dest, char* src) => 返回src字符串在dest字符串中第一次出现的位置
二. 基本概念
1. cc -c test.c main.c将源文件test.c、main.c编译生成目标文件test.o和main.o; cc test.o main.o链接几个目标文件
2. int ch; while((ch = getchar()) != EOF){ putchar(ch) };
三. 数据
1. 可以把字符串常量赋值给一个“指向字符的指针”,但是不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。
2. char *message = "Hello World";(把message声明为一个指向字符的指针,并用字符串常量中的第一个字符的地址作为其值初始化)相当于char *message; message = "Hello World";
3. typedef出现在定义前面 char *ptr_to_char; typedef char *ptr_to_char; ptr_to_char a;将a声明为指向字符的指针
四. 语句
1. while( scanf("%f", &value) == 1 && value >= 0){}
2. switch(expression) {case constant-expression:} //expression的结果必须是整型值,constant-expression必须是常量表达式
3. switch(ch)
{
case ' ': line += 1;
/* FALL THRU */fall through表明ch贯穿所有case,当满足 时除了执行line+=1,下面的words+=1和chars+=1都会执行
case ' ':
case '': words += 1;
/* FALL THRU */
default: chars +=1;
}
4. c不具备布尔类型,用整型表达式代替
5. c不具备任何I/O输入/输出语句,c也不具备任何异常处理语句,这些都是通过调用库函数实现的。
五. 操作符和表达式
1. 将指定位数置1:value |= (1 << bit_number);将指定位数置0:value &= (~(1 << bit_number));判断指定位数是否为0:value &= (1 << bit_value)
2. 逗号表达式的值为整个表达式最右边的值。if(b-10, c+4, d>0)//从左往右依次执行,但整个表达式的值为d>0
3. 下标引用:array[ 下标 ] 等价于 *(array + (下标))
4. lexp代表左值,左值代表一个位置,rexp代表右值,右值代表一个值,在左值的地方不能使用右值,在右值的地方可以使用左值
5. 大写转小写:#include <ctype.h> tolower(ch);
六. 指针
1. 硬件通过地址访问内存位置,编译器帮我们实现通过变量访问内存位置
2. 值的类型并非值本身所固有的特性,而取决于它的使用方式
3. 变量的值就是分配给该变量的内存位置所存储的值,即使是指针变量也不例外
4. 段违例:segmentation violation;内存错误:memory fault
5. 在特定数组中查找某个特定值得函数:返回状态值表示是否找到,如果找到,再返回指向该值得指针
6. 在对指针进行解引用操作/间接访问之前,必须确保指针不是NULL指针
7. *(int *)100 = 25;将整型强制转换为指向整型的指针,用于访问设备控制器接口
8. *p+1表示*p的值加1;*(p+1)表示p指向的地址加1后取值;p+1表示指针指向下一个地址
9. char ch;char *cp = &ch; *cp++//①++操作符产生cp的拷贝②++操作符再增加cp的值③最后在cp的拷贝上执行间接访问操作。
当表达式*cp++作为左值时表示ch的内存位置,作为右值时表示ch的值
10. 当指针初始化为常量字符串时无法进行字符交换,只有当指针指向字符数组时才可以实现交换。
七. 函数
1. 字符串查找:if(strcmp(value, string) == 0)
2. 可变参数的函数:stdarg.h头文件;一个类型va_list;三个宏va_arg, va_start, va_end;
float average(int n_values, ...)
{
va_list var_arg;
int count;
float sum;
var_start(var_arg, n_values);//准备访问可变参数
for(count = 0; count < n_values; count++)
{
sum += va_arg(var_arg, int);
}
va_end(var_arg);
return sum/n_values;
}
3.
2. 432 154