变量:作用域,链接属性,存储类型。
3.1 基本数据类型(P29)
四种:整型、浮点型、指针、聚合类型(数组和结构。)
3.1.1 整型家族
字符、短整型、整型和长整型。
char 1字节
signed char 1
unsigned char 1字节
short/int 至少2字节
long int 至少 4字节
-
整型字面值(P31)
字面值是字面值常量缩写:一种实体,指定自身的值,不允许改变。
const 的变量。 -
枚举类型(P32)
它的值为符号常量不是字面值。
3.1.2 浮点类型
float 4字节
double 8字节 由程序设定
long double
3.1.3 指针(P34)
指针变量就是其值为另外一些内存的地址的变量。
- 指针常量
- 字符串常量
当一个字符串常量出现在表达式中,表达式中所使用的值就是这些字符所存储的地址。
3.2 基本声明
说明符(一个或多个) 声明表达式列表
3.2.1 初始化
int i=16;
3.2.2 声明简单数组
int a[20];
3.2.3 声明指针
int *a; = int (*a);
char *a="message" ;
= char *a; a="message";
3.2.4 隐式声明
函数不显示声明返回值类型,默认返回整型。
3.3 typedef(P38)
typedef char stringgg;
#define无法正确处理指针类型
3.4 常量
const
int const a = 15;
const int a;
int const * pci;(指向整型常量的指针);
int * const pci;(指向整型的常量指针)
int const * const pci (皆为常量 不可更改)
3.5 作用域(P40)
作用域:变量在某个区域才能被访问
不同作用域可以给不同变量同名。
-
代码块作用域
花括号之间作用。
代码块嵌套:内层自成一家。
独立代码块的变量无法被另一个代码块访问。(所以他们的变量可以放在同一个内存地址) -
文件作用域
所有在代码块以外声明的标识符都具有。从声明之处到所在的source code结尾都可以访问。
文件中定义的函数名也具有文件作用域。 -
原型作用域
函数原型中声明的参数名。 -
函数作用域
3.6 链接属性(P42)
标识符的链接属性决定处理不同文件里相同的标识符。
-
none
标识符的多个声明被当做独立不同实体。 -
internal
在同一源文件里所有声明中都指向同一个实体。不同源文件的多个声明分属不同实体。
static int b;
通过static 将变量从external变成internal。 -
external
几个源文件都表示同一个实体。
使用extern 将变量变成外部变量。
但是extern在第二次声明定义的时候不会更改第一次声明的链接属性。
3.7 存储类型(P43)
变量值的内存类型,决定何时创建,销毁以及保存多久。
存储变量地方:普通内存,运行的堆栈,硬件寄存器。
-
静态变量:代码块之外的声明变量存储于静态内存
在程序运行之前创建,在运行阶段始终存在。 -
自动变量:代码块内部声明的变量。存储在堆栈中。程序运行到代码块才创建,离开代码块就被销毁。给内部变量加上static则一直存在。
存储类型不改变该变量作用域,依旧只能在该代码块内部按名字访问。
- register:用于自动变量声明,提示存储在硬件寄存器,为寄存器变量。寄存器变量比内存变量效率高。
初始化:?
3.8 static 关键字
- 用于函数定义以及代码块外变量声明,修改链接属性。
- 用于代码块内部变量,用于修改变量的存储类型。
external链接属性的变量总是静态存储。(P47)