怎样把C语言学好怎样把C语言学好?怎样把C语言学好怎样把C语言学

重要的是急不了的,要一步一步来,慢慢来,把每个知识都学好,烂熟于心,到时就能灵活运用,加油吧孩子。不难的,打好基础

什么是C语言

C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。

c语言static的用法

放在函数内部的static变量互相不会影响,两个static变量是分别独立存在的。

如果您需要它们互相影响,那么应该定义为全局的,放在函数之外。static 型变量只初始化一次,第一次调用fun函数时,f初始化为1,运行完后f仍为1;第二次调用时f的值还是1,不再初始化,于是f在fun运行完后变为2,这样依次完成所有循环,每次计算f时,都沿用上一个循环的f值

C语言中static 的详细说明。

google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大。所以,我这篇博文博采众家之长,把互联网上的资料整合归类,并亲手编写程序验证之。

C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。

下面,详细分析一下static关键字在编写程序时有的三大类用法:

一,static全局变量

我们知道,一个进程在内存中的布局如图1所示:

其中.text段保存进程所执行的程序二进制文件,.data段保存进程所有的已初始化的全局变量,.bss段保存进程未初始化的全局变量(其他段中还有很多乱七八糟的段,暂且不表)。在进程的整个生命周期中,.data段和.bss段内的数据时跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。

当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。所以,普通全局变量穿上static外衣后,它就变成了新娘,已心有所属,只能被定义它的源文件(新郎)中的变量或函数访问。

以下是一些示例程序

file1.h如下:

[cpp] view plaincopy

#include

void printStr();

我们在file1.c中定义一个静态全局变量hello, 供file1.c中的函数printStr访问.

[cpp] view plaincopy

#include "file1.h"

static char* hello = "hello cobing!";

void printStr()

printf("%s\n", hello);

file2.c是我们的主程序所在文件,file2.c中如果引用hello会编译出错

[cpp] view plaincopy

#include "file1.h"

int main()

printStr();

printf("%s\n", hello);

return 0;

报错如下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

file2.c: In function ‘main’:

file2.c:6: 错误:‘hello’ 未声明 (在此函数内第一次使用)

file2.c:6: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其

file2.c:6: 错误:所在的函数内只报告一次。)

如果我们将file2.c改为下面的形式:

[cpp] view plaincopy

#include "file1.h"

int main()

printStr();

return 0;

则会顺利编译连接。

运行程序后的结果如下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

[liujx@server235 static]$ ./file2

hello cobing!

上面的例子中,file1.c中的hello就是一个静态全局变量,它可以被同一文件中的printStr调用,但是不能被不同源文件中的file2.c调用。

二,static局部变量

普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有如下几个区别:

1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。

2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。

以下是一些示例程序:

file1.h的内容和上例中的相同,file1.c的内容如下:

[cpp] view plaincopy

#include "file1.h"

void printStr()

int normal = 0;

static int stat = 0;//this is a static local var

printf("normal = %d ---- stat = %d\n",normal, stat);

normal++;

stat++;

为了便于比较,我定义了两个变量:普通局部变量normal和静态局部变量stat,它们都被赋予初值0;

file2.c中调用file1.h:

[cpp] view plaincopy

#include "file1.h"

int main()

printStr();

printStr();

printStr();

printStr();

printf("call stat in main: %d\n",stat);

return 0;

这个调用会报错,因为file2.c中引用了file1.c中的静态局部变量stat,如下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

file2.c: In function ‘main’:

file2.c:9: 错误:‘stat’ 未声明 (在此函数内第一次使用)

file2.c:9: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其

file2.c:9: 错误:所在的函数内只报告一次。)

编译器说stat未声明,这是因为它看不到file1.c中的stat,下面注掉这一行:

[cpp] view plaincopy

#include "file1.h"

int main()

printStr();

printStr();

printStr();

printStr();

// printf("call stat in main: %d\n",stat);

return 0;

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

[liujx@server235 static]$ ./file2

normal = 0 ---- stat = 0

normal = 0 ---- stat = 1

normal = 0 ---- stat = 2

normal = 0 ---- stat = 3

运行如上所示。可以看出,函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。

三,static函数

相信大家还记得C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。

所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。

下面是一些示例:

file1.h如下:

[cpp] view plaincopy

#include

static int called();

void printStr();

file1.c如下:

[cpp] view plaincopy

#include "file1.h"

static int called()

return 6;

void printStr()

int returnVal;

returnVal = called();

printf("returnVal=%d\n",returnVal);

file2.c中调用file1.h中声明的两个函数,此处我们故意调用called():

[cpp] view plaincopy

#include "file1.h"

int main()

int val;

val = called();

printStr();

return 0;

编译时会报错:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

file1.h:3: 警告:‘called’ 使用过但从未定义

/tmp/ccyLuBZU.o: In function `main':

file2.c:(.text+0x12): undefined reference to `called'

collect2: ld 返回 1

因为引用了file1.h中的static函数,所以file2.c中提示找不到这个函数:undefined reference to 'called'

下面修改file2.c:

[cpp] view plaincopy

#include "file1.h"

int main()

printStr();

return 0;

编译运行:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2

[liujx@server235 static]$ ./file2

returnVal=6

static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。static 用来说明静态变量。

如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用extern关键词也不能访问这个static变量。

如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,也就是说,当你再次调用这个函数的时候,里面用到这个static变量时,就会发现,还是它还是上一次函数调用时的结果。静态变量,就是在定义的时候,有static 修饰的变量,形式为

static TYPE var_name = init_value;

而动态变量,形式为

TYPE var_name = init_value;

即没有static 修饰。其中的=init_value均可省略。

区分定义在函数外的全局变量,和函数内的局部变量,作用域,生命周期,及无显式初始化时的初始值,均有区别。

1 动态全局变量:

作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。

生命周期为从程序运行到程序退出,即贯穿整个运行时间。

无显式初始化时默认初始化值为0。

2 静态全局变量:

作用域为当前文件,从定义/声明位置到文件结尾。

生命周期为从程序运行到程序退出,即贯穿整个运行时间。

无显式初始化时默认初始化值为0。

3 动态局部变量:

作用域为当前函数,从定义位置,到其所在的{}的结束位置。

生命周期为从函数调用到函数退出。

无显式初始化时默认初始化值为随机值。

4 静态局部变量:

作用域为当前函数,从定义位置,到其所在的{}的结束位置。

生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值。

无显式初始化时默认初始化值为0。

c语言static(c语言static是什么意思)相关推荐

  1. C语言的一个关键字——static

    C语言的一个关键字--static Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用stati ...

  2. WPF使用X:Static做多语言支持

    原文:WPF使用X:Static做多语言支持 让程序支持多语言,一般把需要显示的字符串保存在一个资源类的static属性中. <!--[if !supportLists]--> <! ...

  3. C语言 static - C语言零基础入门教程

    目录 一.static 简介 二.static 修饰变量 1.static 局部静态变量 2.static 全局静态变量 三.static 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  4. smali语言详解之static静态代码块的声明与静态变量初始化赋值位置

    smali语言详解之static静态代码块的声明与静态变量初始化赋值位置 一.smali语言的静态代码块声明格式 .method static constructor <clinit>() ...

  5. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  7. c语言中switch语句流程图_C语言:C语言保留字(关键字)

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  8. C语言 extern - C语言零基础入门教程

    目录 一.简介 二.extern 修饰变量 1.在单文件中使用 extern 2.在多文件中使用 extern 三.extern 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C+ ...

  9. 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析

    编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言概念辨析 转自:https://blog.csdn.net/u010533843/article/details/76215487 编译型和解 ...

  10. c语言 存储,c语言存储类

    C为变量提供了5种不同的存储类,还有基于指针的第6种存储类. 不同的存储类提供了变量的作用域.链接和存储时期的不同组合. 作用域:描述了程序中可以访问的一个标识符的一个或多个区域. 一个C变量的作用域 ...

最新文章

  1. 解决tomcat启动后访问页面中文乱码
  2. OAuth2基本概念和运作流程
  3. Drupal6中的表单如果不让修改
  4. 前端学习(1645):前端系列实战课程之留言板功能实现
  5. 史上最全!用Pandas读取CSV,看这篇就够了
  6. 浏览器跨域问题(jsonp)——jsonp详解
  7. Java System.arraycopy()方法示例
  8. SQL Server 触发器--备忘
  9. Struts2_HelloWorld_3
  10. 顶点计划 班委问题讨论
  11. jar包add to build path与放入lib下
  12. 服务器里面增加单页网站,如何设计完美的单页网站
  13. 钉钉群机器人关键词自动回复_wetool自动接受新好友wetool pc版-客服
  14. 大众速腾信息公开案11月10日开庭
  15. 02 食尚年华石锅土鲫鱼需求简单描述
  16. VCC VDD, VEE, VSS是什么意思
  17. 金仓数据库 KingbaseGIS 使用手册(9.4. 拓扑结构构造函数、9.5. 拓扑结构编辑函数)
  18. 【windows】TeamViewer软件连接不上网络
  19. 哪边是上游、哪边是下游
  20. 计算机运筹学pdf,计算题专题七运筹学计算上典型考题思路讲解.pdf

热门文章

  1. 如何使用 Python 构建 西门子PLC Snap7通信
  2. 【Elasticsearch】 es coordinating 节点
  3. R语言----绘制点与点连线图
  4. 摄影测量实习空中三角测量_摄影测量入门:Photoscan
  5. fedora 显示器 输入信号超出范围
  6. C语言基础 - 字符数组
  7. 3.访问数据库的步骤:访问数据库的步骤有哪些???
  8. 基于layui.upload.js 拖拽文件/文件夹上传下载
  9. Java isDigit()
  10. Linux 密码爆破 shadow 文件解密 破解