运算符#
算数运算符: + - * / %(取余数) ++ --(前缀/后缀)
比较运算符: == != > < >= <=
逻辑运算符: && || !
位运算符: & | ~ ^ << >> (位 与、或、非、异或、左移、右移)
赋值运算符: = += -= *= /= %= &= |= ^= <<= >>=
其他运算符: & *(指针) [](数组下标) ()(函数调用/强制类型转换)
sizeof ?: (条件运算符) -> .(结构体成员访问)
"变量<<=移动位数"关键字#
变量类型:int float double char signed unsigned short long const enum union struct extern static register volatile(复杂)
控制流: return while do for continue if else switch case default break goto(不建议)
其他: void sizeof typedef auto(多余)
continue: 继续下次循环
break: 终止循环;或跳出switch,若无,继续判断后续case
default: switch中轮到时默认执行
C中auto不被显式使用,但C++中用于让编译器决定变量类型其他#
强制类型转换#
int a = 12;
printf("float a:\n", (float)a);注释#
//单行注释
/* 单行注释 */
/*
多行注释
*/分隔符#
, ; () [] {}字符常量#
\\: \字符
\': '字符
\": "字符
\?: ?字符
\a: 警报铃声
\b: 退格键
\f: 换页符
\n: 换行符
\r: 回车
\t: 水平制表符
\v: 垂直制表符
\ooo: 一到三位的八进制数(如\101表示字符'A')
\xhh...: 一个或多个数字的十六进制数(如\x41也表示'A')指针#
指针含义#
int value = 1;
int* p = &value; // 指针p存放地址,*p访问对应地址的数据
int** pp = &p; // 双指针 pp 存放指针 p 的地址,*pp访问 p 存放的地址,**pp访问value的值
"双指针严格按照上述规范定义""取地址规范"
int* p = &num // 普通变量
int* p = &arr[3]; // 一个数组元素
int* p = arr; // 数组名
int* p = p1; // p存取p1的内容
int* p = malloc(...); // 函数返回的地址
int* p = "abc";
int* p = NULL;指针加减#
int arr[5]={0,1,2,3,4};
int* ptr1 = arr;
ptr1 = ptr1 + 2; //指针向后移动2个数据类型大小地址
ptr1++;
ptr1--;
ptr1 = arr
int* ptr2 = &arr[4];
dif = ptr2 - ptr1; // 同一数组或同一块内存区域,两指针相隔元素个数 dif=4
指针数组#
int num1=1,num2=2,num3=3;
int* ptrArray[3] = {&num1,&num2,&num3}; // *ptrArray[0]=1, ptrArray[0]= -1896874448内存地址
"指针数组仅可存储地址(新标准)"回调函数#
定义:通过函数指针调用函数,利用一个函数的指针作为参数传递给另一个函数
//回调方式一:定义函数指针类型
typedef int (*FuncPtr)(int, int); //声明函数指针类型为FuncPtr
FuncPtr func = add; //指向任意参数类型相同、返回类型相同的函数地址
printf("callback: %d\n", func(1,4));
int (* FuncPtr)(int, int); // 定义函数指针FuncPtr
//回调方式二:函数参数定义回调函数指针
void call_callback(int (*callback)(int, int)) {
printf("Callback result: %d\n", callback(10, 20));
}
call_callback(add);
"函数指针参数仅能传函数名,仅能用函数指针调用函数"
"python天生支持回调,不像C如此繁琐"