感悟《C和指针》——3.数据

来源:互联网 发布:谷歌数据备份 编辑:程序博客网 时间:2024/06/07 07:15
     所有的程序都对数据进行操作,本章对数据的各个方面进行了描述。特别是变量的三大属性——变量的作用域、链接属性和存储类型决定了变量的“可视性”和“生命期”。
1.基本数据类型
     C语言的基本数据类型包括整型、浮点、指针和聚合类型。
     (1)整型家族。整型家族包括字符(char)、短整型(short int)、整型(int)、长整型(long int)和枚举类型(enum)。其中前四种类型还分为有符号型(signed)和无符号型(unsigned),而且每种数据类型根据是否有符号以及数据类型的长度决定了它所表示的整数的取值范围,一般说来是short int <= int <= long int。在头文件limit.h中存放有各种数据类型最大值和最小值的宏定义常量,如INT_MAX等。枚举类型是用户自定义变量的一种方式,它的值为符号常量而不是字面值,这种类型的变量实际上是整型值,我们可以对符号常量进行显式的赋值。
     关于整形字面值:定义的整型字面值可以指定类型和进制。如17380UL指定无符号长整型数,0xcafe指定十六进制值。
     (2)浮点数家族。浮点数家族包括浮点型(float)、双精度(double)和长双精度(long double),三者表示的浮点数范围的关系是:float <= double <= long double。
     (3)指针类型。这里要区分“指针”和“指针变量”的区别,“指针”其实就是“内存地址”,而指针变量是存放其他变量内存地址的变量。内存地址是没有类型的,而指针变量就好像一种“过滤器”或者说“有色眼镜”,你用不同的指针变量去"看"某段内存地址的值,看到的就是不一样的,用char*看见的是1字节的字符,用int*看见的是4字节的整数。
     (4)聚合类型。聚合类型就是指结构体(struct)和共用体(union)两种结构。
2.基本声明
     声明的形式就是“一个或多个说明符  声明表达式列表”。可以在声明的同时初始化,要小心不要对任何变量或者函数造成隐式声明。
3.typedef
     typedef用于为数据类型指定新的类型别名,typedef在结构体的定义上用的最多,比如 typedef struct node_t { int value; struct node_t *next;} node;此后我们就可以使用node来定义节点类型。
4.常量
     C语言中使用“const”关键字来定义常量类型。常量类型既然是不可更改的对象,那么它们就必须在声明时初始化。const形参在函数调用时得到实参值。这个技巧常用于函数的定义,当用户查看函数声明时,立刻就可以明白它的意图——常量参数是不会被误更改的。
     const和指针联系起来时往往有令初学者费解的表示形式,阅读这类声明的诀窍就在“*”上,把星号前后的内容分开来读就能明白了,举例:
     int *pi;     指向整形变量的指针;
     int const *pci;     指向整型常量的指针(pci可以修改,*pci不可修改);     
     int* const cpi;     指向整型变量的常指针(cpi不可以修改,*cpi可以修改);
     int const *const cpci;     指向整型常量的常指针(cpci和*cpci都不可以修改)。
     字符串字面值:字符串字面值是以‘\0’结尾的字符序列,它的值是 一个指向该字符串第一个字符的地址的常量指针,故“abcdefg”[6]值为‘g’。
5.作用域
     变量声明的位置决定了变量的作用域,作用域包括:文件作用域、函数作用域、代码块作用域和原型作用域。
     (1)文件作用域。文件作用域定义于所有代码块之外,表示该变量在声明处一直到该文件结尾都有效。
     (2)函数作用域。一个函数的所有语句标签(用于goto语句)必须唯一。
     (3)代码块作用域。定义在“{}”之间的变量具有该代码块的作用域,而且这些变量会覆盖代码块外的同名变量。
     (4)原型作用域。原型作用域适用于在函数原型中声明的参数名。
6.链接属性
     变量有三种链接属性:外部(external)、内部(internal)和无属性(none)。
     (1)external属性。指多个源文件中的多个声明对应同一个实体。
     (2)internal属性。指同一源文件内所有声明同属于一个实体,不同源文件内多个声明对应多个不同实体。
     (3)none属性。指每个声明都对应不同的实体
7.存储类型
     变量的存储类型(storage class)是指存储变量的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:运行时堆栈、硬件寄存器和普通内存,分别对应着三种存储类型:自动变量(auto)、寄存器变量(register)和静态变量(static)。
     (1)自动变量。自动变量定义于代码块内部,它在代码块的结束位置自动被系统清除回收。
     (2)寄存器变量。寄存器变量是一种特殊的自动变量,它没有内存地址,其值直接存储于寄存器中,它的初衷是为了提高频繁被访问变量的存取效率,不过这种变量的效率还是决定于编译器。
     (3)静态变量。声明于所有代码块的外部,它具有静态属性,并会被编译器在调用main函数之前初始化(通常为0),函数调用时仍然保持前一次调用的值。
8.static关键字
     static关键字对链接属性原本为external的标识符具有修改链接属性(为internal)的效果,而对其他属性的标识符则是起到修改存储类型(静态)的作用。
0 0
原创粉丝点击