C和指针学习笔记--第三章

1.基本数据类型:整型,浮点型,指针和聚合类型(如数组和结构体)
2.整型分为:字符型,短整型,整型和长整型,他们都分为有符号和无符号两种。
3.对于char类型,本质上是小整型值。char的默认类型就取决于编译器,为了提高程序的可移植性和效率,通常把存储与char类型的值限制在signed char和unsigned char的交集内。
4.可以通过查看limits.h文件来查看各个变量的范围
5.初始化整型常量的时候,可以在数值后面添加后缀来改变缺省的规则,例如:u和L等
如果一个多字节常量前面出现‘L’则表示一个宽字节常量,例如:L‘X’
6.如果一个常量用于确定一个字中的某些特定位的时候,将其写成16进制;如果一个常量用于表示一个字符的时候,将这个值表示为字符常量更合适。
7.枚举类型实际上就是整型,其中每个符号常量可以被赋值。
8.浮点数在缺省情况下都是double类型,可以在数值的后面跟一个L(表示long double类型)或者一个f(表示float类型);在声明的时候除了long double 之外,其余的说明符(short, signed,unsigned)都不可用。
9.在ANSI C中对字符串常量的修改,其效果是未定义的。
10.相等的整型声明
11.如果数组的下标是由那些已知的正确的值计算出来的,则不用进行下标检查,如果是从用户输入的数据产生的则需要检查下标是否越界。
12.使用typedef来创建新类型的名字而不是使用#define,因为后者无法处理指针类型,例如:
#define d_ptr_to_char char*
d_ptr_to_char a,b //其中a为指针类型,b为字符类型
还可以像如下方式使用:
typedef __int8 int8_t;
typedef unsigned __int8 uint8_t;
13.指向整型常量的指针:int const *p
指向整型的常量指针:int *const p
指向整型常量的常量指针:int const * const p

const永远修饰其右边的内容,除非右边没有东西;
14.作用域:
代码块作用域:在代码块(位于一段花括号之间的所有语句)开始位置声明的标识符
注意:如果内层代码块有与外层代码快名字相同的表示符,则外层的那个标识符则在内层无法访问。
文件作用域:在代码块之外声明的标识符都具有文件作用域,包括函数名。
原型作用域:在函数原型中声明的标识符具有原型作用域。
函数作用域:
15.链接属性----决定在如何处理不同的文件中出现的相同标识符
外部属性(external):具有external属性的标识符无论声明了多少次,在不同的源文件中表示不同的实体。只要变量不是声明在代码块内部或者函数定义内部(属于文件作用域),其在缺省情况下的链接属性就是external;如果声明在代码块内部并且在其前面添加extern关键字将使它引用全局变量而非局部变量。同时,就有external链接属性的实体总是有静态存储类型。
内部属性(internal):具有internal属性的标识符在同一个文件中的所有声明指向同一个
实体,但是位于不同的原文中的不同声明指向不同的实体。无属性(none):没有链接属性的标识符每次声明都表示不同的实体。
16.存储类型----决定变量何时创建,何时销毁和它保存多久,变量的缺省类型取决于声明的位置
静态(static)变量:在任何代码块之外声明的变量为静态变量,总是存储在静态内存中,这样的变量在程序运行之前就创建,在整个程序运行期间都存在,直到程序结束。
自动(auto)变量:在代码块内部声明的变量为自动变量,存储在堆栈中,在执行到代码块中
声明变量的时候创建,在代码块执行完毕之后被销毁。
注意:如果给自动变量前面加上static关键字,则该变量从自动变成静态的。
寄存器(register)变量:使用关键字register声明的自动变量,创建时间和销毁时间与自动变量相同,但是使用寄存器变量的函数在返回之前,原来存储在寄存器中的值必须要恢复,确保调用者的寄存器变量未被破坏。
17.自动变量和静态变量的初始化
静态变量:在程序加载到内存中之前,将静态变量的值放到程序执行时使用的变量的内存位置,完成这个任务并不需要额外的时间和指令,如果静态变量没有初始值,则其缺省值为0.
自动变量:需要更多的开销。初始化语句相当与一条赋值语句。
(1)初始化语句相当于赋值语句效率并没有提高
(2)初始化语句可以重复执行
(3)可以使用表达式值作为初始化值
(4)除非对自动变量进行显示初始化,否则其值将是垃圾值。
18.static关键字总结
(1)当其用于函数定义和代码块外部的变量声明时,static关键字修改其链接属性,从external变成internal,变量的存储类型和作用域不改变,这样使函数名和变量名只能在该文件中使用。
(2)当其用于代码块内部的变量的声明时,将自动变量改为静态变量,但是变量的链接属性和作用域不变。

原文地址:https://www.cnblogs.com/anitaguangzi/p/13843389.html