【C语言总结】C语言数据
1.基本数据类型
1.1整型家族
整型家族包括字符、短整型、整形、长整型,他们都分为有符号和无符号两种版本
注:长整型至少应该和整形一样长,而整形至少和短整型一样长
整形字面值
字面值是字面值常量的缩写——这是一种实体,指定了自身的值,并且不允许发生改变(声明为const的变量)
如果一个多字节字符常量的前面有一个L,那么他就是宽字符常量。
1.2浮点类型
浮点家族包括float、double、和long double类型
ANSI标准仅仅规定long double 至少和double一样长,而double至少和float类型一样长。
所有浮点类型至少能够容纳从10^-37到10^37之间的任何值
1.3指针
变量存储于计算机的内存中,每个变量都占据了一个特定的位置,每个内存地址都有地址唯一确定并引用,指针是地址的另一个名字。
C语言并不存在字符串类型,不过C语言提供了字符串常量,在C语言中,字符串是一串以NUL字节结尾的的零个或者多个字符。字符串通常存储中字符数组中,这也是C语言没有显示字符串类型的原因
注:如果需要修改字符串常量,最好把它存于数组中。
当一个字符串常量出现于一个表达式中,表达式所使用的值就是这些字符所存储的地址。
2.基本声明
变量声明的基本形式是:
说明符(一个或多个) 声明表达式列表
2.1初始化
在一个声明中,可以给一个标量变量指定一个初始值,方法是在变量名后面跟一个等号(赋值号),后面是你想要赋给变量的值,例如:
int j = 0;
2.2声明简单数组
声明简单数组,需要在数组名后面跟一对方括号,方括里面是一个整数,指定数组中元素的个数,例:
int array[10];
2.3声明指针
int *a;
*操作符是间接访问操作符,所以a是一个指向int的指针
注:C语言很灵活,也可以使用 int* a;的形式,但是int* a, b, c是声明了一个整形指针a,两个整型变量b和c。
3.typedef
typedef允许为各种数据类型定义新名字
例:typedef char Qtype;
Qtype现在和char一样了
注:应该使用typedef而不是#define来创建新的类型名,会因为后者无法正确的处理指针类型
4.常量
ANSI C允许声明常量,例:
int const a;
const int a;
a是一个整数常量,它的值不能被修改,由于它不能被修改,所以必须在声明的时候对它进行初始化。
int *pi; pi是一个指针变量
int const *ppi; ppi是一个指向整形常量的指针,指针可以修改,但是指针指向的常量无法修改
int * const cpi; cpi是一个指向整型的指针常量,指针指向的值可以修改,指针不能修改
int const* const cppi; 指针和指针指向的常量都无法修改
5.作用域
编译器可以确认四种不同类型的作用于——文件作用域,函数作用域,代码块作用域和与原型作用域
5.1文件作用域
任何在代码块之外声明的标识符都具有文件作用域,它表示标识符从他们的声明之处到源文件结尾处都是可以访问的
5.2函数作用域
一个函数中的所有语句标签必须唯一
5.3代码块作用域
位于一对花括号中的所有语句称为一个代码块
任何在代码块开始位置声明的标识符都具有代码块作用域,表示他们可以被这个代码块中所有的语句访问
5.4原型作用域
原型作用域只适用于中函数原型中声明的参数名
6.链接属性
当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序
标识符的链接属性决定如何处理在不同文件中出现的标识符
链接属性一共分三种,external(外部),internal(内部),none(无)。没有链接属性的标识符总是被当作单独的个体;属于internal链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,单位于不同源文件的多个声明则分属于不同的实体,属于external链接属性的标识符无论声明多少次,位于几个源文件都表示同一个实体
7.存储类型
变量的存储类型是指存储变量值得内存类型,变量的存储类型决变量何时创建,何时销毁以及它的值将保持多久
有三个地方可以用于保存变量:普通内存,运行时堆栈和硬件寄存器
凡是在任何代码块之外声明的变量总是存储于静态内存之中,也就是不属于堆栈的内存,这类变量成为静态变量。
在代码块内部声明的变量的缺省存储类型是自动的,存储于堆栈中。这类变量在代码块执行完毕后就消失
对于在代码块内部声明的变量,给它加上static之后就变成了静态变量,注意,修改变量存储类型并不表示修改该变量的作用域,函数的形参不能声明为静态变量,因为它总是在堆栈中传递给函数用于支持递归
关键字register可以用于声明一个寄存器变量
8.static关键字
当它用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external变为internal,但标识符的存储类型和作用域不受影响
当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,单变量的链接属性和作用域不受影响。