c语言中对象的概念就是内存,该块内存可以分配空间 也可以没有分配空间 都称之为对象
左值的概念是 指定对象的表达式 必须是指定内存上某个位置
变量的作用域
–块作用域
–函数作用域
–函数原型作用域:指的是函数原型中的形参
–文件作用域:也叫全局变量
变量的链接:
–外部链接:声明在所有函数外 int a;可以在其他翻译单元 中使用
–内部链接:声明在所有函数外,但是被static修饰 static int a;只能在当前翻译单元中使用
–无链接:声明在块内,仅当前块可以使用的变量
变量的存储期:
–静态存储期:程序执行期间一直存在,文件作用域的变量都为静态存储期
–线程存储期:以关键字_Thread_local 声明的对象
–自动存储期:块作用域的变量,局部变量
–动态分配存储期:动态分配的内存
函数与存储类别:
–外部函数:默认
–静态函数:static int func();
–内联函数:
ps:为了解决函数受限于当前文件时,用extern声明定义在其他文件的函数,这样做表明当前文件中使用的函数被定义在其他文件中。
几个关键字的介绍:
extern
作用是指明函数要使用外部变量,如果不实用extern,在函数内重新声明同名变量是一个新的变量
#include "stdio.h"
int a;
int b;
int fun()
{
a = 2;
printf("%p\n", &a);
return 0;
}
int main(int argc, char const *argv[])
{
extern int a; //这里的a是最上面全局变量
int b; //这里的b是新创建的局部变量
printf("%p\n", &a);
fun();
return 0;
}
运行结果
3
0x7ffe3e70220c
0x40402c
auto说明符表明变量是自动存储期,只能用于块作用域的变量声明中。由于在块中声明的变量本身就具有自动存储期,所以使用auto主要是为了明确表达要使用与外部变量同名的局部变量的意图
register 说明符也只用于块作用域的变量,它把变量归为寄存器存储类别,请求最快速度访问该变量。同时,还保护了该变量的地址不被获取
用 static 说明符创建的对象具有静态存储期,载入程序时创建对象,当程序结束时对象消失。如果static 用于文件作用域声明,作用域受限于该文件。如果 static 用于块作用域声明,作用域则受限于该块。因此,只要程序在运行对象就存在并保留其值,但是只有在执行块内的代码时,才能通过标识符访问。块作用域的静态变量无链接。文件作用域的静态变量具有内部链接
extern 说明符表明声明的变量定义在别处。如果包含 extern 的声明具有文件作用域,则引用的变量必须具有外部链接。如果包含 extern 的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,这接取决于该变量的定义式声明
总结:
自动变量具有块作用域、无链接、自动存储期。它们是局部变量,属于其定义所在块(通常指函数)私有。寄存器变量的属性和自动变量相同,但是编译器会使用更快的内存或寄存器储存它们。不能获取寄存器变量的地址
具有静态存储期的变量可以具有外部链接、内部链接或无链接。在同一个文件所有函数的外部声明的变量是外部变量,具有文件作用域、外部链接和静态存储期。如果在这种声明前面加上关键字static,那么其声明的变量具有文件作用域、内部链接和静态存储期。如果在函数中用 static 声明一个变量,则该变量具有块作用域、无链接、静态存储期
具有自动存储期的变量,程序在进入该变量的声明所在块时才为其分配内存,在退出该块时释放之前分配的内存。如果未初始化,自动变量中是垃圾值。程序在编译时为具有静态存储期的变量分配内存,并在程序的运行过程中一直保留这块内存。如果未初始化,这样的变量会被设置为0
具有块作用域的变量是局部的,属于包含该声明的块私有。具有文件作用域的变量对文件(或翻译单元)中位于其声明后面的所有函数可见。具有外部链接的文件作用域变量,可用于该程序的其他翻译单元。具有内部链接的文件作用域变量,只能用于其声明所在的文件内。