初学者对static的认识
来源:互联网 发布:网络语笔芯是啥意思 编辑:程序博客网 时间:2024/05/16 11:22
我觉得编程中的知识,只有经常去使用,或是因为使用这个语法不当而报错,绞尽脑汁,找出问题所在,加以改正,才能真正理解和掌握其中的奥妙。而对于一个像我这样的初学者,static,const这样的关键字是很少会被用到的。如今有了一些知识和经验,了解到这两个关键字的重要性,有时虽然不是必须的,但加以利用会使程序健壮性大大增加,使程序更加合理。
首先这两个关键字都属于存储级别关键字。对于一些大牛来说,static和extern放在一起分析更加合理,毕竟有其用法的相似性和区别。但是作为一个初学者,曾遇到最不解的还是这两个大神常用而自己觉得用不着的关键字。
static
static的用法主要分为三种情况。
1.在全局变量中使用
用法:在全局变量的数据类型前加static。
改变:全局变量将变为静态全局变量。
未变:静态全局变量和其他的全局变量的存储地点并没有区别,还是存储在原先的BSS段或数据段中。
作用:作用往往是初学者最关心的了。很多大牛对一些语法的分析深入浅出,但往往忽略了一些菜鸟最关心的问题,这玩意儿是干嘛用的?其作用就是使这一全局变量只在定义它的源文件内有效,其他源文件无法访问它。这在大型项目的编写中尤为重要(虽然也没做过),大型项目需要多人共同完成,每个人定义的变量可能会出现重名的情况。在整体编译时就会出现错误,为了避免这一情况的发生,我们就需要用到static修饰,打造只属于自己的全局变量。
- 在static1.c中
#include<stdio.h>int a=1;
- 在static2.c中
#include<stdio.h>int a=2;
gcc static1.c static2.c -o static -Wall
会报变量a被多次定义的错。
- 在static1.c中
#include<stdio.h>static int a=1;
- 在static2.c中
#include<stdio.h>static int a=2;
编译通过,且各自原文件输出的是各自的值。
2.在局部变量中使用
用法:在全局变量的数据类型前加static。
改变: 1. 位置:静态局部变量被编译器放在数据段,所以它虽然是局部的,但是在程序的整个生命周期中存在。
2. 访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3. 值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0(所以不会存在BSS段),以后每次调用静态局部变量的时候都用上次调用后的值。
作用:在静态局部变量中,对其前两点的使用并不太多。但是前两项的改变必须具备,正是有了这两种机制的改变,才使得我们可以利用其值的改变搞事情。比如像我们在一个函数中定义了一个变量,我们希望调用这个函数时,这个变量只被初始化一次,而后每次调用都沿用上次修改后的值,这个时候就必须要用到static了。例:
#include<stdio.h>int func(){ static int x=0; x++; return x;}int main(){ int a=0; while(a<5) { a=func(); printf("%d ",a); } printf("\n"); return 0;}
其输出结果为1 2 3 4 5
3.用在函数身上
用法:在函数返回值类型前加static。
改变: 限制其作用域为本源文件。
作用:同上面全局变量一样,也只是为了加一个限制条件, 当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些不希望被看到的函数。
总结
总体来讲,static的主要作用分两点。一方面是起限制作用,被你标记的就是你的,别人是不能乱动你的东西的。就算他有个名字和你一样的,也只能他用他的你用你的,万一拿错了,也不会使。而另一方面大用处就是加了static的变量只被初始化一次,在统计函数的调用次数时就要用到。
初来乍到,有疏漏的地方望各位大牛多多指教~~
- 初学者对static的认识
- 对static关键字的认识
- 一个初学者对Linux的简单认识
- 一个初学者对Linux的简单认识
- 初学者对软件测试的认识
- 初学者对Android的认识和理解
- 初学者对Spring MVC的认识
- 初学者对敏捷开发的认识
- 初学者对堆和栈的认识
- 浅谈对static修饰符的认识
- 巩固对static关键字的认识
- 新手入门篇:初学者对Spring框架的认识
- 一个初学者对虚方法、重写、重载的认识
- 有关初学者对JAVA中的String的认识(1)
- 新手入门篇:初学者对Spring框架的认识
- 一个初学者对Linux的简单认识(2)
- 初学者对const的认识(常类型变量)
- 初学者对java数组中栈和堆的认识
- UVa489
- 交叉编译器的制作
- Java中内存泄露问题
- svn 上传.a文件失败问题
- android应用获取通知栏权限
- 初学者对static的认识
- javascript学习笔记--04
- Hibernate关系注解
- 161027
- 使用指南 (六)—— 使用 Docker 部署 Django 容器栈
- 《您的设计模式》(CBF4LIFE)之“访问者模式”【整理】
- 编写一个方法,去掉一个数组中的重复元素
- 设计模式(五)单例模式
- tomcat启动途中闪退