C 语言四大存储类型。&&C语言32大关键字
1。extern, 从其英文意思外部的就能看出,这个表示引用一个外部变量。。
C语言程序编译时是以每个.c 文件为单位的,最后再把它们链接在一起,所以每个文件中的全局变量对于其他文件是可见的,所以可以在一个文件中引用其他文件中的变量和函数。
extern 关键字就是用来表示引用别的单元的变量。。。
比如。。file1.c 中
int main()
{
extern int c ; //引用外部变量。。。
exten int sum(int a, int b);
scanf("%d",&c);
printf("%d ",c);
}
在 file2.c中
int c ;
====================================================================================
所以 file1.c可以用其他变量。。
如果 file2.c 中并没有定义变量c ,那么此用法将是错误的。。
同理,函数也可以用此方式。。
如果外部文件中的全局变量定义为 static ,则也不能extern操作。
2 。。 static
上文提到了static
static 有两重功能, 第一是修饰全局变量,和函数,这样的效果是其他文件不能引用static修饰了的变量和函数。
比如:
file1.c
int main()
{
extern int a ; // 引用错误
extern int sum(int ,int ) // 错误。。
.....
}
file2.c
static int a;
static int sum(int a, int b);
因此。。
static 的第一个功能是当其修饰全部变量和函数时,能限定变量和函数的作用域在此文件,而不被其他文件所见。
第二。 当static 修饰局部变量时。。
众所周知,函数中局部变量是自动分配在栈中的,当函数结束时会自动销毁栈中的数据。。
如果用static 修饰时:
int fun( )
{
static int count = 0;
return count ++;
}
int main()
{
int i;
for (i = 0; i<10 ; i++)
fun();
}
由于 fun()中的 count 为static修饰。 所以它被分配在内存中的静态存储区, 而不是栈中, 因此它的生命周期伴随着整个程序而不是函数,它不会随着函数的结束而销毁, 但是在函数外部也不能引用它,只能在每次进入函数后操作。
每次for 循环时,count 会 自加1 。。。
静态局部变量只初始化一次,如果没有初始化,那么会自动初始化为0 。。
因为内存中的静态存储区会被自动初始化为 0;
因此可以 static char str[100] ;
这时str 被初始化为0,而不用去手动初始化,这也是一种方法。。
static 和 auto 变量是不同的。
3 。 auto 变量
C语言中默认的数据存储类型都是auto 变量,即自由变量,它在定义的位置被自动任意分配到内存中 ,所以当到它的作用域之外时,会自动被OS 销毁。。
注意: 全部变量不是auto 型,它是在静态存储区的。。
一个变量不能同时用 static 和 auto 修饰,比如 static auto int a ;
这样定义是相互矛盾的。。
所以 对于 auto 变量, 必须在使用时初始化, 或者赋给值,否则它的值是无效值。
4 register
rigister 为寄存器变量, 由于某些数据CPU 要经常读取,为了读取快捷,编译器会把这些数据放寄存器中,而不放在内存中,这样CPU 便可以直接从其寄存器中读取数据。。
但是 寄存器的数量毕竟有限,并不是所有定义的register变量都存储在寄存器中 。。
register 变量的数据类型必须符合cpu寄存器支持的数据类型 ,一般为整型和浮点型,现在的CPU寄存器也基本支持浮点型。
register 变量的数据长度必须小于等于寄存器所支持的最大数据长度。
register 变量有可能没有存储在内存中, 所以不要用& 取其地址。
现在的CPU 速度已足够运算了,所以register变量已经过时了 ,尽量不用。
C语言32大关键字
所谓关键字也叫保留字,它是标识符的一种,标准规定它是编译器默认的某些类型,因此用户不可用它的一样的标识符去表示其他的东西。
标准C有32个关键字:
一 数据类型关键字 12 个:
1 . char
2 . short
3 . int
4 . long
5. enum
6. float
7. double
8. signed
9. unsigned
10. struct
11. union
12.void
二 控制类型关键字 12 个
循环语句
1.for
2.do
3.while
4. break
5.continue
条件语句
6.if
7.else
8.goto
开关语句
9.switch
10.case
11.default
返回语句
12.return
三 存储类型 4个
1. auto //声明自动变量,一般不不用,局部变量默认都是auto型
2.static //声明静态变量
3.extern //声明一个外部变量
4.register //声明寄存器变量
四 其他关键字 4个
1.const //声明只读变量
2.sizeof //运算符, 计算数据占用内存
3.typedef //自定义类型
4.volatile //修饰的变量可能改变
注意,不要把 define ,include当做关键字 ,它们只是预编译伪指令。。
C99标准又增加了5个关键字,分别是
restrict
它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式
inline
内联函数,在C++中用的多, 它是宏定义的一种优化实现方式
_Bool
unsigned int 型,在C99中被定义为布尔型,只可容纳0,1两个值
_Complex
复数类类型
_Imaginary
纯虚数类型
C11 标准在C99的基础上又增加了一个关键字
_Generic 泛型