秒杀C语言关键字static

1.static 基本介绍:

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。

在c语言中,static是一般用来修饰变量和函数的。

2.C语言中内存大致分布

在c语言中,内存存储一般划分在三个区域:堆区栈区静态区。这三个区域存储的数据大致如下图所示:

秒杀C语言关键字static_第1张图片

3.static修饰变量

        1.首先来看static修饰局部变量。代码如下:

秒杀C语言关键字static_第2张图片

 当未使用static关键字修饰局部变量时,打出来的是十个1,下面来看看当使用static修饰时结果如何:秒杀C语言关键字static_第3张图片

当使用static修饰时,结果就是1 2 3 4 5 6 7 8 9 10了,显然与上面未使用static修饰结果不同。下面我们来分析一下为什么会是这样的呢?

 我们都知道,一个局部变量的作用域在它被限制的范围内(简单来说就是{}内部),例如本代码中局部变量x的作用域只存在于GB函数之中,一旦出来这个函数,x这块空间就被销毁(即返还于操作系统之中。)所以当x没被static修饰时,每次调用函数过后,因为出去了作用域,所以被销毁,当再次进入函数内部时又重新开辟了一块空间来存储x,地址也随之发生了改变。所以打印的结果都是1。

当x被static修饰时,x(局部变量)原本被存入在栈区,现被存放到静态区内部,改变了其内部存储位置。使得其生命周期变长了,但是其作用域并未发生改变,仍然还是在GB函数内部。每次调用过后不必再次为x开辟新的内存,而是使用上一次返回的值继续运行。所以返回的值是1~10;

        注:即使static修饰局部变量后使变量生命周期变长了,但是其作用范围还是没有改变,这点要特别注意!

        2.修饰全局变量时,代码如下:

秒杀C语言关键字static_第4张图片

我们都知道,全局变量具有外部链接性,即在一个项目中,不同源文件都可以使用,但需要使用extern关键字来声明扩展。所以在4.18项目中创建一个全局变量QJ,在4.20仍然可以使用。下面我们来看看当全局变量被static修饰时会结果还会是如此么?代码如下:

秒杀C语言关键字static_第5张图片秒杀C语言关键字static_第6张图片

结果是编译发生错误,我们来看看哪点出错了。

结果显示无法解析外部符号QJ,即全部变量QJ未能够被成功使用。这是为什么呢?

这就要该思考新添加的static的关键字其的作用了。

当static修饰全局变量时,改变了其链接属性,由其原来的外部属性改为了内部属性。使得这个全局变量QJ只能在自己所在的源文件使用了,其他源文件都不能使用。所以导致编译器报错。

4.static修饰函数。

其实修饰函数与修饰全局变量原理是一样的,都是改变了其链接属性,使其从外部链接属性转化为内部连接属性。下面来看一段代码:

秒杀C语言关键字static_第7张图片

未使用static修饰函数时,正常使用函数Add,当使用static修饰时,结果如下:

与static修饰全局变量同理,都是将其链接属性改变了。

总结:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

今日分享C语言关于static关键字内容大致结束,欢迎大家积极评论指出不足以及做出补充。

 

 

 

 

 

 

 

 

你可能感兴趣的:(c++,java,数据结构)