C和C指针读书笔记
2016-04-13 12:22
267 查看
1. C中变量的存储类型
存储类型分为静态存储(普通内存),堆栈,寄存器自动变量即代码块内部的变量存储于堆栈,其他变量存储于普通内存即静态存储,如果频繁访问一个变量,声明为寄存器类型后存储于硬件寄存器中。
2. C中实体的链接属性
(1)属于internal链接属性的标识符在同一个源文件内的所有声明中都指向同一个实体,但位于不同源文件的多个声明分属不同的实体。
(2)属于external链接属性的标识符无论声明多少次、位于几个源文件都表示同一个实体。
(3)属于none链接属性的标识符总是被当作单独的个体,也就说该标识符的多个声明被当作不同的实体。
(4)只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性即为external。如果一个变量声明 于代码块内部,在它前面添加extern关键字将使它所引用的是全局变量而非局部变量。
(5)具有external链接属性的实体总是具有静态存储类型
3. C中的extern和static
(1)这两个关键字用于在声明中修改标识符的链接属性。比如某个声明具有external链接属性,前面加上static关键字使它的链接属性变为internal。
(2)除了实体的具体定义位置之外,在它的其他声明位置都使用extern关键字。
4. 存储类型、作用域、链接属性的总结
5. 局部变量名于全局变量名相同时,在代码块内将使用局部变量,全局变量将被隐藏直到代码块末尾。
6. const声明其值不会修改的变量,在定义const只读变量时需初始化,以后无法修改;函数参数为const只读,那么在函数内部不能修改此参数。
7.关于移位操作符
(1)<< 和 >>为移位操作符(分别为左移和右移)
(2)他们的左操作数为待移动的数,右操作数为移动的位数
(3)待移的数必须为整形,最好是无符号整形,这样不管是左移还是右移,其逻辑移位和算术移位都一样。
(4)如果是带符号整形,左移逻辑移位和算术移位一样(左移的逻辑移位指左面的位移掉,右边添0)。右移的逻辑移位是右面的移掉,左面添0,右移的算术移位是右面的移掉,左面的如果符号位是1就添1,符号位是0就添0,这个也跟编译器有关,所以可移植性不强。
8. 对不同类型的值进行比较或赋值,往往不能得到想要的结果。
9. ++和--
(1)前缀形式的++操作符出现在操作数的前面,操作数的值被增加,而表达式的值就是操作数增加后的值。(先加后用)
(2)后缀形式的++操作符出现在操作数的后面,操作数的值被增加,但表达式的值是操作数增加前的值。(先用后加)
10. 如果无法确定一个表达式的最终值的存储位置,那么这个表达式就不是一个合法的左值。
11. 指针运算,不管是加减乘除,还是大于等于等比较,前提是两个操作数必须指向同一个数组中的元素,即连续线性的内存。
12. 除了优先级之外,下标引用和间接访问完全相同,比如a[1] = * (a+1)。
13. int *a; a++; 第二条语句进行了乘法运算,原因是指针+1,结果是当前地址+4(编译器会把1乘以指针指向类型所占内存,这里是4,然后加上当前地址,得到最终结果为表达式结果)。
14. array[i++]也进行了乘法运算,这个乘法运算会比第4点中的乘法运算更花时间和空间,因为第4点中执行乘法运算的都是两个相同的数(1和4)。
结果,这个乘法只在编译时执行一次,即程序现在包含了一条指令,把4与指针相加,程序运行时并不执行乘法运算。
存储类型分为静态存储(普通内存),堆栈,寄存器自动变量即代码块内部的变量存储于堆栈,其他变量存储于普通内存即静态存储,如果频繁访问一个变量,声明为寄存器类型后存储于硬件寄存器中。
2. C中实体的链接属性
(1)属于internal链接属性的标识符在同一个源文件内的所有声明中都指向同一个实体,但位于不同源文件的多个声明分属不同的实体。
(2)属于external链接属性的标识符无论声明多少次、位于几个源文件都表示同一个实体。
(3)属于none链接属性的标识符总是被当作单独的个体,也就说该标识符的多个声明被当作不同的实体。
(4)只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性即为external。如果一个变量声明 于代码块内部,在它前面添加extern关键字将使它所引用的是全局变量而非局部变量。
(5)具有external链接属性的实体总是具有静态存储类型
3. C中的extern和static
(1)这两个关键字用于在声明中修改标识符的链接属性。比如某个声明具有external链接属性,前面加上static关键字使它的链接属性变为internal。
(2)除了实体的具体定义位置之外,在它的其他声明位置都使用extern关键字。
4. 存储类型、作用域、链接属性的总结
5. 局部变量名于全局变量名相同时,在代码块内将使用局部变量,全局变量将被隐藏直到代码块末尾。
6. const声明其值不会修改的变量,在定义const只读变量时需初始化,以后无法修改;函数参数为const只读,那么在函数内部不能修改此参数。
7.关于移位操作符
(1)<< 和 >>为移位操作符(分别为左移和右移)
(2)他们的左操作数为待移动的数,右操作数为移动的位数
(3)待移的数必须为整形,最好是无符号整形,这样不管是左移还是右移,其逻辑移位和算术移位都一样。
(4)如果是带符号整形,左移逻辑移位和算术移位一样(左移的逻辑移位指左面的位移掉,右边添0)。右移的逻辑移位是右面的移掉,左面添0,右移的算术移位是右面的移掉,左面的如果符号位是1就添1,符号位是0就添0,这个也跟编译器有关,所以可移植性不强。
8. 对不同类型的值进行比较或赋值,往往不能得到想要的结果。
9. ++和--
(1)前缀形式的++操作符出现在操作数的前面,操作数的值被增加,而表达式的值就是操作数增加后的值。(先加后用)
(2)后缀形式的++操作符出现在操作数的后面,操作数的值被增加,但表达式的值是操作数增加前的值。(先用后加)
10. 如果无法确定一个表达式的最终值的存储位置,那么这个表达式就不是一个合法的左值。
11. 指针运算,不管是加减乘除,还是大于等于等比较,前提是两个操作数必须指向同一个数组中的元素,即连续线性的内存。
12. 除了优先级之外,下标引用和间接访问完全相同,比如a[1] = * (a+1)。
13. int *a; a++; 第二条语句进行了乘法运算,原因是指针+1,结果是当前地址+4(编译器会把1乘以指针指向类型所占内存,这里是4,然后加上当前地址,得到最终结果为表达式结果)。
14. array[i++]也进行了乘法运算,这个乘法运算会比第4点中的乘法运算更花时间和空间,因为第4点中执行乘法运算的都是两个相同的数(1和4)。
结果,这个乘法只在编译时执行一次,即程序现在包含了一条指令,把4与指针相加,程序运行时并不执行乘法运算。
相关文章推荐
- C++作业3
- 调用摄像头拍照
- Boosting学习(三)—Adaboost原理白话
- 搭建一个php框架
- 复杂链表的复制
- 几种 angular 循环。。。。
- $.get()/$.post()/$ajax() 异步请求的例子
- ( ̄︶ ̄)↗ 涨姿势
- linux 挂载ntfs格式分区
- C++类中的static数据成员,static成员函数
- eclipse 逆向工程生成hibernate实体类(注解或配置文件)
- WebView的常规用法
- NodeJS、NPM安装配置步骤(windows版本)
- 数组中的逆序对
- 循环列表设立头指针和尾指针
- C++ 正则表达式的简单实用
- Visual Studio中没有为此解决方案配置选中要生成的项目
- 华为OJ 二叉树遍历
- Android Framework的启动过程
- LeetCode 39. Combination Sum