一些杂碎的小知识点

1.字符常量如'$'是存储在int中的,但实际上只使用int的一个字节来存储'$'的编码
 
2.printf的返回值:返回打印字符的个数,如果有输出错误,那么返回一个负数
scanf的返回值:返回成功读入的项目个数,如果没有读到任何项目(比如它期望读入一个数字,但是你输入了一个非数字的情况)则返回0。当检测到文件结尾的时候,返回EOF(EOF是stdio.h中定义的特殊值。一般宏定义为-1)
 
3.数组初始化是从静态区把一个字符串复制给数组,而一个指针的初始化只是复制字符串的地址
 
4.calloc相对于malloc来说的特点之一就是前者会把块中的所有位置都置唯0.
 
5.为什么使用指针:1,跨函数的共享 2.堆内存相关操作必须用指针 3.优化函数的传参。
 
6.清空缓冲区stdin->_IO_read_ptr = stdin->_IO_read_end;
 
7.计算struct的大小:两条原则:
①每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。
②当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。
 
而union的大小取决于他所有的成员中占用空间最大的一个成员的大小。
 
8.转义字符的表示方法总结:
\011 \101这个里的数字表示八进制数,\后面跟着的数字为八进制,且只有前三个有效,比如\1234则表示123对应的字符和字符4.
\x则用到后面跟着的所有数字
更详细到C++Prime P36
 
9.任何一种数据类型,其最大值的特点是最高位为0,其余为均为1,而最小值,其特点是最高位为1,其余位均为0。因此对于任何一种数据类型,只要通过位移运算,得到符合上述特点的补码就可以获取到相应数据类型的最大值和最小值。现假设要计算短整型的数据范围
1<<(sizeof(int)*8-1)  
-2147483648  
~(1<<(sizeof(int)*8-1))  
2147483647  
  
注意以下差异:  
(short)(1<<(sizeof(short)*8-1))  
-32768  
(short)(~(1<<(sizeof(short)*8-1)))  
32767  
((short)1)<<(sizeof(short)*8-1)  
32768  
~(((short)1)<<(sizeof(short)*8-1))  
-32769  
  
((int)1)<<(sizeof(int)*8-1)  
-2147483648  
~(((int)1)<<(sizeof(int)*8-1))  
2147483647  
  
((long)1)<<(sizeof(long)*8-1)  
-2147483648  
~(((long)1)<<(sizeof(long)*8-1))  
2147483647  
 
 
 
x
 
 
 
 
 
1
1<<(sizeof(int)*8-1)  
2
-2147483648  
3
~(1<<(sizeof(int)*8-1))  
4
2147483647  
5
  
6
注意以下差异:  
7
(short)(1<<(sizeof(short)*8-1))  
8
-32768  
9
(short)(~(1<<(sizeof(short)*8-1)))  
10
32767  
11
((short)1)<<(sizeof(short)*8-1)  
12
32768  
13
~(((short)1)<<(sizeof(short)*8-1))  
14
-32769  
15
  
16
((int)1)<<(sizeof(int)*8-1)  
17
-2147483648  
18
~(((int)1)<<(sizeof(int)*8-1))  
19
2147483647  
20
  
21
((long)1)<<(sizeof(long)*8-1)  
22
-2147483648  
23
~(((long)1)<<(sizeof(long)*8-1))  
24
2147483647  
25

 
 
 
 
10.typedef 语句最后要加;
#define语句后不用
因为前者是C语言的语言,后者不是C语言语句,是预编译语句。
 
 
11.清理输入缓存区
getchar()
scanf("%*[^\n]"),scanf("%*c")
stdin->_IO_read_ptr  =  stdin->_IO_read_end
 
12.数据遇到什么条件才会从缓存区达到屏幕
 1.满到4k
 2.遇到/n
 3.遇到输入类型的函数
 4.手动刷新 fflush(stdin);
 5.程序结束
 
13.在内存上优先定义数组,不管定义顺序
 
14.case 中范围  case 1...3:
 
15.switch中不能使用continue.
 
16.
①当调用函数时候,如果没有提前声明,编译器会猜测函数的格式,如果猜测正确则正常执行,否则出错
②如果函数不需要参数,则定义函数时要写void
如果小括号内是空的,则任意类型任意多参数都可以调用函数,使函数的安全性降低
③不写return不代表没有返回值
 
17.对于空指针不能使用的原因:0地址是操作系统的复位地址,存储了要重启时候要使用的数据,NULL也是应用程序的错误标志。
措施:使用来历不明的指针前先检查
 
18.auto和static不能一起使用,全局不量也不能用auto,auto:定义自动分配释放的变量
 
19.static:
限制作用域
改变存储位置
延长生命周期
 
20.程序在内存中的分布
代码:可执行文件会被全部加载到此段
只读:字面值,常量
全局:被初始化过的全局变量
bss:静态变量和未初始化过的全局变量
程序执行前会清理这段内存
栈:局部变量,块变量
堆:程序员自己管理,无法取名,足够大
 
21.编译时命令行添加宏定义  -D
 
22.
man 1 普通命令
man 2 系统调用
man 3 库函数

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





posted @ 2018-07-17 21:26  LyndonMario  阅读(231)  评论(0编辑  收藏  举报