C语言的值传递机制:
值传递拿到的是复印件,也就是说在被调用函数中对复印件涂涂画画,并不影响原件
C++引用:
c++ 风格的编译器中采用引用传递机制,也就是说拿到的就是主函数中的变量,只不过改变了一个名字
& 在不同的位置,不同的语境下,功能完全不同
在类型后面是外号(引用)char* &p_ref;
在变量前面是地址(取地址)&a, c++的引用;
在两数中间是计算(位运算)a & b
C语言风格的字符串:
C语言中没有专门为字符串使用的数据类型,故声明一个字符串需要用到字符数组 char s[20]
C字符串 末尾用 ‘\0’ 作为字符串结束标志, 或手动添加或编译器自动添加,故申请的字符串数组的长度 ≥ 字符串长度 + 1

strlen() 函数获取字符串有效长度
strcmp() 字符串比大小,比的是ASCII码的值,并且是逐字符比较
“a” 与 “abandon” ,’a’ = ‘a’, ‘\0’ < ‘b’, 故 “abandon” > “a”
scanf() “%c”:
scanf() 中 %c 会输入一切字符,包括空白字符,避免方法: 在%c 前加空格,scanf(“ %c”,&ch)
结构体对齐问题:
结构体在内存中所占大小 ≥ 结构体内数据类型长度相加
. 运算符
结构体的指针变量访问结构体变量时
struct stiudent_s *pstu = &stu;
(*pstu).id 通常会简写为 pstu -> id
数组作为函数参数长度丢失问题:
一位数组 arr[] 作为函数参数,会丢失长度,退化为一个地址
这就是为什么 scanf(“%s”,str), str前不用加 &str

二维数组 arr[][b] 作为函数参数,会丢失行的数据
指针的偏移 :
对指针做偏移 ——–> 访问数组的元素
int arr[3] = {1,2,3};
int *p = arr;
p+n = p中存的地址 + n* sizeof(int);
指针可以使用 [ ] 运算符

野指针、空指针
野指针:随便找一个整数赋值给指针变量
空指针:地址为零的指针变量,一旦犯错一定会报错
int *p = NULL
堆空间:
需求:被调用函数弹出栈帧后,局部变量仍然存在,那么就用堆空间解决
malloc():动态申请空间
free():动态释放空间
运算符优先级:
单目运算符 > 算数运算符(+,-)> 关系运算符(==)> 逻辑运算符(&&,||)> 赋值运算符(=,>)
自增
++i:先自增后返回,所以拿到的内容是新的
i++:先返回后自增,所以拿到的内容是原来的数
continue、break:
continue跳出本次循环

break 跳出单层循环,把循环停掉
