这篇文章不错:https://blog.csdn.net/wangjun_huster/article/details/69486956
1、变量
C语言的规则是:变量必须先定义才能使用。对变量的定义其实就是请求计算机,让计算机将内存中的某个或几个单元分配给你定义的变量使用。
把地址为2000的内存单元,起个名字叫“i”,怎么知道变量的地址值呢用&i。
我又想到指针了,*a,a放的就是地址值。a=&i,*a我就能取到i的值了,也就是内存地址为2000单元的值了。
常量
在程序中,你怎么弄都不会变的值
分类:
1.const int a=10;
但是这里的a实质上还是一个变量,只不过是给a赋予了常量的属性
所以不能 const int a=10;
int arr[a]; //数组的大小不能定义成变量
2.字面常量
平时见到的1,’w‘等,可以直接使用的都叫作字面常量
3.#define 定义的标识符常量 例如:#define M 100
要注意的是程序运行时,程序中所有M都被换成100来执行,程序中是不存在M的,所以可以执行 int arr[M]
4.枚举常量 enum
生活中的还有些东西是可以一 一列举出来的比如性别 ,血型,所以可以定义为枚举类型
enum Sex //enum Sex是枚举类型
{
MALE,
FEMALE,
SECRET //这些叫做枚举常量,值是从0开始递增
}
枚举的使用
enum Sex sex = MALE;
2、数据类型
数据类型的定义则可以确定计算机给该变量分配多大的内存。不同规范的C语言有不同规定,一般,int 2字节,char 4字节吧
1.生命周期
变量的生命周期,也称生存期,是指变量值保留的期限。按照生命周期,可将变量分为两类:静态变量和动态变量。
静态变量:变量存储在内存中的静态存储区,在编译时就分配了存储空间,在整个程序运行期间,该变量占有固定的存储单元,变量的值都始终存在,程序结束后,这部分空间才释放。这类变量的生存期为整个程序。
动态变量:变量存储在内存中的动态存储区,在程序运行过程中,只有当变量所在函数被调用时,编译系统才临时为该变量分配一段内存单元,该变量才有值,函数调用结束,变量值立即消失,这部分空间释放。我们说这类变量的生存期仅在函数调用期间。
2.作用域
变量的作用域也称为可见性,指变量的有效范围,可分为局部和全局两种。
局部变量:在一个函数或复合语句内定义的变量是局部变量,局部变量仅在定义它的函数或复合语句内有效。
全局变量:定义在所有函数之外的变量是全局变量,作用范围是从定义开始,到本文件或程序结束。
3.C语言变量
C语言中的变量有:自动变量、寄存器变量、外部变量、内部静态变量和外部静态变量。下面分别就这几个变量进行简单说明。
C语言中extern的用法
转载链接:https://www.cnblogs.com/dushikang/p/8532804.html
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享
1. extern修饰变量的声明。
举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。
2. extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。
使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。