C和指针(二)数据

数据类型
1,C语言中仅有四种基本数据类型——整型、浮点型、指针、聚合类型(数组、结构等)。

2,整型包括字符、短整型、整型、长整型,且可以分为有符号和无符号两种版本。
1)长整型至少和整型一样长,整型至少和短整型一样长。大小由编绎器决定。

3,设计char类型变量是为了容纳字符型值,本质上是小整型值。
1)缺省char是signed char或unsigned char取决于编绎器。
2)不同编绎器取值范围不同不利于程序移植,显式声明char为signed或unsigned可提高程序的可移植性,可确保不同机器中字符符号值保持一致。
3)但有些机器处理signed char比unsigned char高效,并且处理字符的库函数参数声明为char,显式声明unsigned或signed可能带来兼容性问题。
4)当可移值问题比较重要时,最佳方案将char型变量值限制在signed char和unsigned char交集内,这样可获得最大可移植性,同时不失效率。

4,字面值即字面值常量,指定值且不允许改变。
1)字面值后添加L或l后缀表long整型,添加U或u后缀表unsigned整型,各添加一个表unsigned long整型。
2)字面值缺省情况下是能完整容纳这个值的最短类型。

5,字符常量是单引号包围的单个字符、转义字符、三字母词,类型是int。
1)多字节字符常量前L表宽字符常量。

6,负数常量不是字面值常量,而是常量表达式,负号表单目操作符不是数值一部分。
7,当字面值确定字中某些特定位的位置时,写成十六进制或八进制更合适,例0xF0等。
8,枚举类型值为符号常量而不是字面值,变量实际以整型方式存储。

9,浮点类型通常以一个分数以及一个以某个假定数为基数的指数组成,包括float、double、long double类型。
1)表示浮点值的方法有很多,标准未规定必须使用特定格式。
2)标准规定long double至少和double一样长,double至少和float一样长。
3)标准规定了所有浮点类型至少能够容纳-1037到1037之间的值。

10,C不存在字符串类型,但提供了字符串常量,一串以NUL字节结尾的零个或多个字符,通常存储在字符数组中。
1)字符串常量不允许修改,程序中不同位置同一个字符串常量存储在同一个内存,在某处修改字符串常量会影响其他位置字符串常量。
2)当字符串常量出现在表达式中,表示的是字符串存储的地址,可以把字符串常量赋值给指向字符的指针,但不能把字符串常量赋值给字符数组,此时字符串常量并不代表字符本身。
3)标准C函数库提供了一组操作字符串复制、连接、比较、计算长度、查找特定字符的函数。

声明
1,声明说明符包含了关键字,用于描述声明的基本类型。
1)说明符也可以改变标识符的缺省存储类型和作用域,例short、long、signed、unsigned。
2)声明整型变量时,声明中已经至少有了一个其他的说明符,关键字int可以省略。
3)signed一般用于char类型,其他整型缺省情况下都是有符号数,char是否是signed则由编绎器决定。

2,声明一维数组需要指定数组元素个数,编绎器不检查数组下标的越界,实际编程中注意溢出。

3,声明指针*紧跟变量名前,一条语句声明多个指针每个变量名前紧跟*,否则就变成指针指向的类型。
例:
char *message = “hello world”;
等同于
char *message;
message = “hello world”;

3,函数如果不显式声明返回值类型,默认返回整型,省略形参类型时,编绎器默认为整型。
4,C语言支持typedef为数据类型定义新名称,应用于复杂较长的声明,并且修改一处所有生效。5,#define不能正确处理指针类型,需要使用typedef代替创建指针类型。
6,使用const关键字声明常量,常量不可修改,声明时初始化,声明为const的形参在函数调用时由实参初始化。

常量
1,指针常量和常量指针。
1)指针常量是指针本身是个常量,声明时初始化不可修改指针指向,可通过指针修改指向的内容。
2)常量指针是指针指向的内容是常量,可修改指针指向,不可通过指针修改指向内容。

2,#define也可以创建名字常量,允许使用字面值常量的地方都可以使用define的名称代替,但define没有类型检查。
3,const变量只能用在允许使用变量的地方,当常量应用于程序多处时修改一个名字常量比搜索整个程序修改字面值常量容易,提高了程序的可维护性。

作用域
1,编绎器确定4种不同类型的作用域:文件作用域、函数作用域、代码作用域、原型作用域。

2,代码块作用域即代码所在花括号的区域,声明于内层代码块标识符的作用域在代码块尾部结束,且内层代码块标识符隐藏外层相同名称的标识符,无法通过名字访问外层相同名称的标识符。
1)无重叠作用域的代码块可以共享同一块内存地址,任何时刻最多只会有一个处于活动状态。
2)函数形参的作用域是整个函数体,声明于函数最外层作用域的局部变量不可与形参同名。

3,声明于所有代码块之外的标识符具有文件作用域,作用域起始于声明处终止于文件结尾。
1)在文件中定义的函数也具有文件作用域,函数不属于任何代码块。
2)在头文件声明并#include到其他文件的函数具有其他文件的文件作用域,作用域不仅限于头文件尾。

4,原型作用域只适用于函数声明中的形参,参数名字非必需,且不必与函数定义中形参匹配,也不必与函数调用中实参匹配。
5,函数作用域只适用于语句标签goto语句,函数中所有语句标签必须唯一。

链接属性
1,程序中源文件编绎成目标文件,链接器链接目标文件生成可执行程序,不同源文件中相同标识符具有不同的链接属性。

2,链接属性分为外部(external)、内部(internal)、无(none)。
1)无链接属性的相同标识符为独立的实体。
2)内部链接属性的相同标识符在同个源文件中指向同一个实体,在不同源文件分属不同的实体。
3)外部链接属性的相同标识符在不同源文件中表示同一个实体。

3,关键字extern和static声明时可修改链接属性。
1)具有外部链接属性的标识符声明时加上static则链接属性变为内部链接属性,标识符为当前源文件私有,static只对缺省为外部链接属性的标识符生效。
2)extern作用于标识符的第一次声明时可指定标识符为外部链接属性,如果用于该标识符的第2次及以后的声明,不会改变该标识符第一次声明时static指定的链接属性,当标识符具有文件作用域时,可省略该关键字。

存储类型
1,变量存储类型指存储变量值时的内存类型,取决于变量的创建、销毁、保持,通常存储在普通内存、运行时堆栈、硬件寄存器。
1)声明于所有代码块之外的变量存储于静态内存,程序运行之前创建,在程序整个执行期间存在。
2)代码块内部声明的变量缺省为自动变量存储在堆栈,关键字auto修饰该存储类型,但极少使用,程序执行声明时创建变量,离开代码块时销毁。
3)关键字register用于自动变量声明,存储变量于硬件寄存器。

2,代码块内部变量声明时加上static则由自动类型变为静态类型,修改存储类型不修改作用域,只可在代码块内部按名字访问。
1)函数形参不可声明为静态类型,函数支持递归外层形参会被下一层调用修改。

3,寄存器访问比内存访问高效,但不能太多,编绎器有一套寄存器优化方法,可能忽略register关键字,按普通自动变量处理。
1)典型情况下,将使用频率最高的变量声明为寄存器变量,或将指针声明为寄存器变量可提高程序效率,尤其是频繁执行间接访问的指针。
2)寄存器变量创建和销毁时间和自动变量相同,但需要做一些额外工作。
3)当前使用寄存器变量的函数在返回前,需要将寄存器的值恢复到函数调用之前,使用运行时堆栈完成恢复,进入函数前,将所有使用的寄存器内容保存到堆栈,函数返回时将堆栈内容恢复到寄存器。

初始化
1,程序编绎时将静态变量初始值存储在静态内存,程序加载后将静态内存中初始值赋值给静态变量。
1)只需要初始化一次。
2)静态变量初始化和使用不需要额外时间和额外指令。
3)不显式指定初始值时,默认初始化为0。

2,自动变量初始化需要更多开销,因程序链接时不确定自动变量的存储位置,函数的局部变量每次调用可能占用不同的内存位置。
1)自动变量没有缺省值,需要显式的在声明时初始化,或在使用前赋值。
2)除了声明为const的变量必须初始化,自动变量初始化和赋值无差别。
3)函数内自动变量每次调用都需要重新初始化,初始化在运行时执行,可以用任何表达式作为初始化值。

static关键字
1,当关键字作用于函数定义和代码块之外变量声明时,static修改标识符的链接属性,从外部链接修改为内部链接,存储类型和作用域不受影响,只能在当前源文件访问。
2,当关键字作用于代码块内部变量声明时,static修改变量存储类型,从自动变量修改为静态变量,链接属性和作用域不受影响,程序执行前创建,程序结束销毁。
3,变量声明于代码块之外缺省具有外部链接属性,所有源文件都可以访问,变量声明于代码块内,extern关键字表示引用全局变量而非声明局部变量。
4,外部链接属性的变量具有静态存储类型,程序开始前创建,程序结束销毁。
5,函数内部局部变量在函数开始时创建,函数返回销毁,但用于执行函数的机器指令在程序生命期内一直存在。

6,局部变量不能被其他函数通过名字引用,缺省情况下为自动存储类型,使用时才分配内存,可以减少内存总需求量。
1)在堆栈分配内存可以有效实现递归。
2)如果变量的值在多次调用中需要保存原先值或最终值,可以修改存储类型为静态变量。

猜你喜欢

转载自blog.csdn.net/mei_true/article/details/130833525
今日推荐