数据类型2

来源:互联网 发布:平板装ubuntu 编辑:程序博客网 时间:2024/05/24 06:08

2.6.1 static

简单来说static修饰变量,就是指该变量空间独立于函数中的auto变量或者栈变量,static变量空间在内存中的静态区分配。

1.修饰局部变量

在用static修饰局部变量后,该变量值在初次运行时进行初始化工作,且只进行一次。

#include<stdio.h>

void fun()

{

static int a=1;a++;

printf("%d\n",a);

}

int main(void)

{

fun();

fun();

return 0;

}  程序执行的结果为 2 3

说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自增运算,所以得到的结果为3.

对于静态局部变量如果没有进行初始化的话,对于整型变量系统会自动对其赋值为0,对于字符数组,会自动赋值为“\0”

2.修饰全局变量

对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(extern进行声明即可)

(1)file1.c

int a=1;

(2)file2.c

#include<stdio.h>

extern int a;

int main(void)

{

printf("%d\",a)

return 0;

}    执行结果为 1

但是如果在file1.c中吧“int a=1”改为“static int a=1”,那么在file2.c是无法访问到变量a的。原因在于用static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。

3.修饰函数

用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。

2.6.2 extern

extern可以修饰变量和函数,表示该变量或者函数在其他地方被定义,在这里声明使用它,这样多个源文件共享变量和函数。

1.extern变量名
在任何函数体外声明或定义变量时,不加extern可能是定义也可能是声明,编译器选择初始化的那个(最多一个地方对它进行丁初始化),如果没有初始化则任选其中一个作为定义,其他为声明,但是加extern肯定是声明如果不想让其他源文件链接到,则需要使用static
关键字。
在函数体内声明(注意是声明,在函数体内部不能定义外部变量)使用其他源文件中定义的变量时,必须使用extern关键字,因为在函数体内默认为局部变量。
2.extern函数
函数默认是外部的(在函数体内或函数体外声明一个外部函数,extern关键字均可省略),如果不想让其他源文件链接到,在函数前加static关键字。
前面提到过,编译器并不检查多个源文件共享的变量的类型是否一致,那么下面的代码是合法的。

char a[]="hello";

int mian()

{

extern int a;

printf("%x\n",a)

return 0;

}

同样,多个源文件共享函数,编译器也不会对外部函数的参数类型、参数个数和返回值类型进行检查,只要函数名相同即可。

int echo (int x)

{

return x;

}

int main()

{

extern int echo(char);

printf("%d\n",echo(255));

rentrn 0;

}

2.7 const

const是constant的简写,表示海枯石烂,恒定不变,一旦相伴,永不变"心"。只要一个变量前面用const来修辞,就意味着该变量里的数据可以被访问,不能被修改。我们其实还可以给它起个更雅的名字——readonly.

例如:

const int a=10;去掉类型int变成“const a=10”,a的值不变。

2.8 auto

auto关键字在我们写的代码里几乎看不到,但又是无处不在的。在c代码中会出现大量的函数模块,每个模块都有其生命周期,在函数生命周期中声明的变量通常叫做局部变量,也叫做自动变量。

例如:

int fun()

{

int a=10; //auto int a=10;

//do something

return 0;

}

 整型变量a在fun函数内声明,其作用域为fun函数内,出来fun函数,不能被引用,a变量为自动变量°也就是说编译器会在"int a=10"之前会加上auto的关键字。auto的出现
意味着当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。


0 0