C语言学习入门 (七) 变量与函数,static和extern关键字

来源:互联网 发布:简洁大气 网站 源码 编辑:程序博客网 时间:2024/05/16 06:13

局部变量

1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

全局变量

1> 定义:在所有函数外部定义的变量,称为全局变量。

2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

变量的存储类型

C语言根据变量的存储类型(变量存储的位置:1. 运行时堆栈 2.普通内存 3.寄存器)的不同,

可以把变量分为:自动变量、静态变量、寄存器变量

> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,

基本上是废的,因为所有的局部变量在默认情况下都是自动变量。存在堆栈

> 哪些是静态变量: 存在内存,程序结束才销毁

  • 所有的全局变量都是静态变量
  • 被关键字static修饰的局部变量也是静态变量

> 哪些变量是寄存器变量:

  • 被关键字register修饰的自动变量都是寄存器变量
  • 只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行
  • 寄存器变量只限于intchar指针类型变量使用

extern与函数

  • 外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
  • 内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。
    • C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。

> extern修饰的函数就是外部函数,默认情况下,所有的函数就是外部函数        extern void one();   int two();

> 你想要把其他源文件中定义的外部函数拿过来声明,完整的做法,应该使用extern关键字,表示引用别人的"外部函数”:

extern void one();//需要 在 main() 之前引入,  这里的extern 也可以省略

static与函数

定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数)

这样该函数就只能在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。

extern与全局变量、局部变量

> 默认情况下,一个函数不可以访问在它后面定义的全局变量,若要使它可以访问 则:

extern int a; //extern是用来声明一个已经定义过的变量

void cc() { a = 7; }

int a = 9;

> 声明多个 相同的全局变量 ,表示的是同一个变量  如:

int a;

main() {};

int a;

int a;

> 在局部变量前 加extern

int a;

main()

{

extern int a;   //这还是全局变量那个 a

//int a;    这是局部变量

}

>  假如在多个源文件中都有全局变量int a;,那么这些源文件的所有全局变量int a;都代表着同一个变量

使用方法 1:  1.c  int a   2.c  int a

      2:  1.c  int a    2.c  extern int a

      3:    1.c   extern  int a   2.c   int  a

      4:   1.c    extern  int a    2.c   extern int a      这是错的,都声明,没有定义

static与全局变量、局部变量

> 如果在定义全局变量的时候加上static关键字,此时static的作用在于限制该全局变量的作用域,

只能在定义该全局变量的文件中才能使用,跟其他源文件中的同名变量互不干扰

> static 局部变量,与普通的局部变量不一样。它的存储区域是全局性的。

void test_static_params() {    static int pp = 8;    pp++;    printf("%d\n", pp);}for (int i=0; i<5; i++) {    test_static_params();//静态局部变量放在程序的全局存储区中,即后续改变其值,也是在上一次改变的基础上    //不是一个临时的局部变量}输出910111213


0 0
原创粉丝点击