长整型(long)至少应该和整型(int)一样长,而整型至少应该和短整型(short)一样长。
1. 整型字面值:字面值(literal)为字面值常量的缩写,是一种实体,指定了自身的值,并且不允许发生改变。
2. 枚举类型:枚举(enumerated)类型就是指它的值为符号常量而不是字面值的类型。
头文件limits.h说明了各种不同的整数类型的特点。定义了CHAR_BIT、CHAR_MIN等。
头文件float.h定义了名字FLT_MAX、DBL_MAX和LDBL_MAX,分别表示float、double和long double所能存储的最大值。FLT_MIN、DBL_MIN和LDBL_MIN则表示最小值。
浮点数字面值在缺省(默认)情况下都为double类型。
指针是地址的另一个名字,指针变量就是其值为另外一个(一些)内存地址的变量。
K&R C: 在字符串常量的存储形式中,所有的字符和NUL终止符都存储于内存的某个位置。因具有相同的值的不同字符串常量在内存中是分开存储的,所以许多编译器都允许程序修改字符串常量。
ANSI C: 声明若对一个字符串常量进行修改,其效果未定义。若需修改字符串,可将其存储于数组中。
在程序中使用字符串常量会产生一个“指向字符的常量指针”。
不可把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,并非这些字符本身。
1. 变量声明的基本形式:
说明符(一个或多个) 声明表达式列表
说明符: 包含了一些关键字,用于描述被声明的标识符的基本类型。
声明表达式列表:被声明的标识符的列表。
typedef:
char *ptr_to_char; //把变量ptr_to_char声明为一个指向字符的指针
typedef char *ptr_to_char; //把标识符ptr_to_char作为指向字符的指针类型的新名字
ptr_to_char a; //声明a是一个指向字符的指针
在指针中使用typedef优于#define
2. 常量
int const a;
const int a;//均将a声明为一个整数
int *pi; // pi是一个普通的指向整型的指针
int const *pci;//是一个指向整型常量的指针。可修改指针的值,不可修改它所指向的值
int *const pci; //声明pci为一个指向整型的常量指针。指针为常量,其值不可修改,可修改其所指向的整型的值
int const *const cpci; //指针本身与其所指向的值均为常量,不允许修改
创建名字常量:
#define MAX_ELEMENTS 50 //允许使用字面值常量的地方均可使用 √
int const max_elements=50; //const常量只能用于允许使用变量的地方
代码块作用域: 任何在代码块开始位置声明的标识符都具有代码块作用域。(位于一堆花括号之间的所有语句成为一个代码块)
文件作用域: 在所有代码块之外声明的标识符都具有文件作用域。表示从声明之处到所在原文件结尾均可访问。缺省为external链接属性。
原型作用域: 只适用于在函数原型中声明的参数名。
函数作用域: 只适用于语句标签,语句标签用于goto语句。(一个函数中的所有语句标签必须唯一)
标识符的链接属性决定如何处理在不同文件中出现的标识符。
none:该标识符的多个声明被当作独立不同的实体。
internal:该标识符在同一个源文件中的所有声明都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。
external:该属性的标识符不论声明多少次,不论位于几个源文件,都表示同一个实体。具有该链接属性的实体总是具有静态存储类型。
EX:
typedef char *a;
int b;
int c(int d)
{ int e;
int f(int g);
...
}
//b,c,f的链接属性为external,其余标识符的链接属性则为none
关键字extern和static用于在声明中修改标识符的链接属性。
static:若某个声明在正常情况下具有external链接属性,在它前面加上static关键字可使它的链接属性变为internal。且static只对缺省链接属性为external的声明才有改变链接属性的效果。
entern:当该关键字用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性,若用于该标识符的第2次或以后的声明时,则不会更改由第1次声明所指定的链接属性。
变量的存储类型是指存储变量值的内存类型。
静态变量:在任何代码块之外声明的变量,总存储于静态内存中(不属于堆栈的内存)。静态(static)变量在程序运行之前创建,在程序整个执行期间始终存在。若非赋不同的值或程序结束,则其值不变。缺省初始值为0.
自动变量:在代码块内部声明的变量,存储于堆栈中。代码块中的变量在缺省情况下便为自动(auto)变量。该变量在代码执行完毕后就消失。若给在代码块内部声明的变量加上关键字static,可使它的存储类型从自动变为静态。
因实参总在堆栈中传递给函数,所以函数的形参不可声明为静态。
无缺省初始值(因函数的局部变量在函数的每次调用中可能占据不同位置)。
寄存器变量:关键字register可用于自动变量的声明,提示它们应该存储于机器的硬件存储器而不是内存中,这类变量称为寄存器变量。初始值时垃圾。
若将使用频率高的变量声明为寄存器变量,则可以提高程序的效率。
注:static关键字
用于函数定义或代码块之外的变量声明时——修改标识符的链接属性。
(external—>internal) 只可在声明它们的源文件中使用。
用于代码块内部的变量声明时——修改变量的存储类型。
(自动变量—>静态变量)
全局变量 在程序开始执行之前创建,且在程序整个执行过程中始终存在。
局部变量(从属于函数)在函数开始执行时创建,在函数执行完毕后销毁。仅由函数内部使用过,不可被其他函数通过名字引用。缺省时的存储类型为自动。
作用域、链接属性和存储类型总结
变量类型 | 声明的位置 | 是否存于堆栈 | 作用域 | 如果声明为static |
---|---|---|---|---|
全局 | 所有代码块之外 | 否 | 从声明处到文件尾 | 不允许从其他源文件访问 |
局部 | 代码块起始处 | 是 | 整个代码块 | 变量不存储于堆栈中,它的值在程序整个执行期一直保持 |
形式参数 | 函数头部 | 是 | 整个函数 | 不允许 |
变量的三个属性为:作用域、链接属性和存储类型
这篇博客只是简单的汇总了关于数据与变量的一些基本知识点
Emmm课后也没有编程练习
那就 下一章节见啦~