0%

c补丁

C语言参考

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 跳出单层循环,把循环停掉