重拾C之数据
C中只有四种数据类型,整型,浮点型,指针和聚合类型
一。整型
字符,短整型,长整形,整型
标准中并没有规定长整形要比短整型长,规定:长整形至少应该和整型一样长,而整型至少应该和短整型一样长
short int 至少16位,long int 至少32位,缺省的Int的位数多以机器的环境字长来决定。char型变量的值最好限制在unsigned char和signed char的交集里,考虑到兼容性问题,char最好不要参与算术运算
整型字面值:用const声明的变量,当一个程序中出现整型字面值的时候,它属于那种类型有字面值最后的字符决定,L为long型,u为unsigned型,另外字符常量的类型总是Int,你不能在后面添加别的后缀
枚举类型
枚举类型就是指他的值为符号常量而不是字面值的类型;例如 enum Jar_Type {CUP,PINT,QUART,HALF_GALLON,GALLON}
这条语句声明了一个类型,称为Jar_Type,这种类型的变量按如下方式声明
enum Jar_Type millk_type,gass_can,medicine_bottle;
这些类型的变量其实是以整型的方式存储,这些符号名的实际值都是整型,你可以为这些符号名制定特定的整型值
enum Jar_Type{CUP=8,PINT=16,QUART=32,HALF_GALLON=64,GALLON=128};
不要把整型和枚举值混在一起使用
二。浮点型
float double long double组成,他们的长度规定和Int,short int ,long int 相近
三。指针
C中不存在指针常量,如果你需要修改字符串,请把它存储与数组中 你可以把字符串常量赋值给一个“指向字符的指针”,但是不能把一个字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身
声明指针:int *b,*c,*d;是声明三个指针的正确方式
四。typedef
typedef声明的写法和普通的声明基本相同,只是把typedef这个关键词出现在声明前面
char *ptr_to_char; 改为 typedef char *ptr_to_char; ptr_to_char a; 声明a是一个 指向字符的指针
应该 用typedef而不是#define 来创建新的类型
五。常量
用const关键字来声明常量,他们的值不能修改
如何初始化1。 在声明的时候对他进行初始化 int const a=150; 2.在函数中声明为const的形参在函数被调用时会得到实参的值
当涉及到指针变量时,情况变得有趣。
Int *pi;
int const *pci; 是一个指向整型常量的指针,你可以修改指针的值,但是你不能修改它所指向的值
int * const cpci;是一个指向整型的常量指针,指针是常量,它的值无法修改,但是你可以修改它所指向的整型的值
#define指令时另一种创建名字常量的机制 只要允许使用字符值常量的地方都可以用,比如声明数组的长度,而const只能用于允许使用变量的地方
六。作用域
1.代码块作用域(位于一对花括号之间的所有的语句称为一个代码块)
2.文件作用域
任何在所有代码块之外声明的标识符都具有文件作用域,从声明处开始到它所在源文件的结尾处都可以访问,在文件中定义的函数名也具有文件作用域
3.原形作用域
只适用于在函数原型中声明的参数名,,在原型中(也就是声明的时候),参数的名称并非必需,可以随便起 ,不必跟定义的时候的形参名保持一致
七。链接
三种:external,internal,none
代码块外的和函数默认的属性是external,而代码块内部的默认为时None型的
None总是被当做单独的个体,也就是说该标识符的多个声明被当做独立不同的实体, internal的标识符在同一个源文件内的所有声明中都指向同一个实体,external的标识符不论声明多少次,位于几个源文件中都表示同一个实体
static关键字可以将external链接属性的改为Internal属性的,而且只对缺省链接属性为external的声明才起作用
extern关键字,如果为一个标识符知道指定external链接属性,则,可以访问在其他位置定义的这个实体
八。。存储类型
有三个地方可以用于存储变量:普通内存,运行时堆栈,硬件寄存器
auto,static,register
尽量不要用register,因为编译器不一定会理睬,在有些计算机中,可以将使用频率最高的那些变量声明为寄存器变量,可以提高程序效率
在代码块内部声明的变量的缺省类型时auto ,也就时说它存储在堆栈中,在代码块之外声明的变量的缺省存储类型为static类型的,这类静态变量在程序运行之前创建,在程序的整个执行期间始终存在,始终保持原型的值,除非给他赋一个不同的值,或者是程序结束
函数的形参不能声明为静态的,因为实参总是在堆栈中传递给函数,用于支持递归,在代码块内部声明的变量,如果给他加上static关键字,就变成了静态局部变量了
初始化:静态变量,系统会自动给其赋值,而动态的不会,如果不给他显式的初始化,他们的值总是垃圾