printf:行缓冲:满一行输出
① ‘\n’ ② scanf
eg:printf(”hello world“);//hello world 不输出
while(1);
加 换行符 或者后面有 scanf() (共用缓冲区,scanf()前会将里面的显示清空)
printf 特殊使用:\033 控制码
可控颜色,背景色,闪烁。。。
scanf:缓冲区\n问题,清理垃圾
eg:printf(”input a: \n“);
scanf ("%d",&a);
printf (“input char b: \n”);
scanf ("%c",&b);
当输入1时,其实在缓冲区输入的是 1\n;a是int型拿走了1,但是缓冲区剩下了\n,b是字符型,拿走了\n。所以会导致输入一次程序就结束了。如果b是非char型就不会,应为其他的类型接收不了\n;
switch-case
最后加上default:没有匹配到的就进入
编码规范
右左法则:在函数参数中传入i++,++i;只要记住i++,就是将当时i的值传入,++i就是在那先写个i等所有参数运算结束后,将i的值传入
野指针
首先了解:#define NULL (void*)0 :零地址:不能赋值,不能操作
类型一、指针定义没有初始化(在4.0版本以下容易出现问题,4.0以上已优化)
4.0以下,会分配一个垃圾值给ptr;
4.0以上,会初始化为NULL;
其中导致的问题:内存泄露(4.0以下出现,4.0以上会报段错误)
主要原因在于这个垃圾值有可能是一个已经定义了的变量地址,如果出现这种情况,会出先无法预计的问题
类型二、指针由malloc申请了内存空间,在free释放时,ptr没有置空
导致空间释放了但指针变量仍指向该空间,如果再次使用该指针会遇到问题
避免野指针:养成良好的编程习惯:1、指针没有明确指向时,置空 2、释放后指针置空
malloc和 free
malloc注意:1、形参传参时,申请空间的大小要注意,不要直接传数字 2、返回值要强转 3、检查malloc是否分配成功 4、对分配空间初始化(memset)5、使用时注意越界问题
free问题:释放后,指针要置空
malloc开销大:malloc分配空间会额外多分配一部分用来存储各属性(大小之类的),所以这也是为什么free不需要输入大小的原因
数组名:指针常量,保存数组首元素的地址
数组指针实用:
在func()需要传入的是高维数组时
func(char *ptr)一维
func(char (*ptr)[5])二维
func(char (*ptr)[5][5])三维