c语言中仅有四种基本类型
整形
浮点型
指针
聚合类型(如数组和结构)
所有其他类型都是由这四种类型派生而来。
3.1.1整形家族
字符
短整形
整形
长整形
都分为有符号和无符号两种。
—为了保持最佳的可移植性,把字符得值限制在有符号和无符号字符范围的交集之内,或者不要在字符上执行算术运算。
当程序使用的char型变量的值位于signed char 和unsigned char的交集时,这个程序才是可移植的例如ASII码字符集中的字符都位于这个范围内。许多处理字符的函数把参数声明为char
整形字面值
字面值这个术语是字面值常量的缩写,是一种实体,指定了自身的值,并且不允许发生改变。
表示整形字面值的几种方式。
枚枚类型它的值为字面常量而不是字面值
3.1.2浮点类型
头文件float.h中定义了浮点数不同类型的最大最小值。
浮点数字面值在缺省状态下都是double类型的,除非它后面跟一个L或者l表示它是一个long double类型的值,或者跟一个F或者f表示它是float类型的值。
3.1.3指针
可以有效地实现诸如tree和list这类高级数据结构。
允许在指针上执行算术或比较操作
允许以任何方式创建指向已经存在的数据对象的指针。
对指针的不加限制也容易造成一些错误。
指针常量和非指针常量在本质上是不同的。把指针常量表达为数值字面值的形式几乎没有用处,c语言内部并没有特意定义这个概念。
-字符串常量,c语言不提供字符串类型,但存在字符串常量,c语言存在字符串的概念:它就是一串以null字节结尾的零个或多个字符。通常存在字符数组中。选null做终止符,因为它不是一个可打印的字符。
字符串的书写形式
3.2基本声明
3.2.1初始化
3.2.2声明简单数组
c语言数组两个需要关注的问题一个是数组下标总是从0开始,最后一个下标是元素数目减一。第二个是编译器并不检查程序对数组下标的引用是否在数组的合法范围内,这种不加检查的行为有好处也有坏处。好处是不需要浪费时间对有些已知是正确的数组下标进行检查,坏处是这样做将使无效的下标引用无法被检测出来,一个良好的经验法则是如果下标值是从那些已知是正确的值计算得来,那么就无需检查它的值,如果一个用作下标的值,是根据某种方法,从用户输入的数据产生而来,那么在使用它之前必须进行检测。确保它们位于有效的范围内。
3.2.3声明指针
int* b,c,d; b是一个指针,其他两个变量是两个普通的整形。要声明三个指针,正确的语句是int *b,*c,*d;
3.2.4隐式声明不是一个好主意。
3.3typedef
允许为各种数据定义新名字,注意不要使用#define,因为它无法处理指针类型。
3.4常量
ANSI C允许声明常量,常量的样子和变量一样,只是它们的值不允许修改。
如何在一开始就让其获得一个值,一可以在声明时就对其初始化int const a =15;二在函数中声明为const的形参在函数调用时会得到实参的值。
当涉及指针时情况情况更有趣,因为有两样东西都可以成为常量,指针变量和它所指向的实体。
当你声明变量时,如果变量的值不会被修改,应该在声明时使用const关键字,这种做法不仅使你的意图在阅读程序的人面前更加清晰,而且当这个值被意外修改时,编译器能发现这个问题。
#define指令是另一种创建名字常量的机制,const只能用于允许使用变量的地方。
3.5作用域
3.5.1代码块作用域
3.5.2文件作用域
任何在所有代码块外声明的标识符都具有文件作用域。它表示这些标识符从从它们的声明之处直到它所在的源文件结尾处都可以访问它。
3.5.3原型作用域
只适用于在函数原型中声明的参数名。在原型中(与函数定义不同)参数的名字并非必须。如果出现参数名字可以随意起名字,不必与函数定义中的形参名匹配。也不必与函数调用时所传递的实参相匹配。
3.6链接属性
-决定如何处理在不同文件中出现的标识符。
链接属性一共有三种。extern intern none
3.7存储类型
变量的存储类型是指存储变量值的内存类型。
变量的存储类形决定变量何时创建,何时销毁,以及它的值保持多久。
三个地方存储变量,普通内存,运行时堆栈,硬件寄存器。
3.8static关键字
-当它用于函数定义或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从extern改为intern,但标识符的存储类型和作用域不变。
3.9作用域存储类型事例
3.10总结