title : C语言函数与程序结构

tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义

grammar_cjkRuby: true

外部变量

变量声明用于说明变量的属性(类型),而变量定义还会引起存储器分配

int sp;
double s[MAX];

声明地方:函数外

如果上面的变量定义在所有函数之外,即为外部变量,并为这两个外部变量sp、s[MAX],分配储存单元以及数组的长度,在其源文件中的所有函数都可以使用这两个外部变量。

extern int sp;
extern double s[MAX];

为该源文件声明两个外部变量sp、s[MAX],不同的是这两个变量的长度在源程序的其他源文件中定义,没有再重新建立变量和分配储存单元。

源程序的所有源文件中,一个外部变量只能在某一个文件中声明,而其他地方不能再定义一个相同的外部变量,如果要使用该变量可以通过extern声明进行访问。

外部变量定义的地方必须指明数组的长度。

静态变量

static int sp;
static double s[MAX];

声明地方:函数外,函数内

将sp、s[MAX]这两个外部变量声明为静态变量,除了该源文件内的函数可以访问sp、s[MAX],但是其他文件不可以通过extern访问静态变量sp和s[MAX]。

同样static同样也可以声明自动变量(在函数内部定义使用的变量),不过不同于其他内部变量,该变量不管其所在函数是不是被主函数调用,它一直存在不会随着所在函数被调用退出之后而消失,也就是说用static定义的内部变量只能在特定的函数内有自己独立的储存空间。

寄存器变量

register int sp;
register double s[MAX];

声明地方:函数内以及函数的形参

register的作用是告诉编译器,它声明的变量在程序中使用的频率较高,把声明的变量放在机器的寄存器中,这样会使程序更小、执行速度更快

程序块

while(***){
int i=1;
if(***){
……
}
……
}

花括号包括的语句就是一个程序块,在其中声明的变量会隐藏程序块以外的同名变量,该程序块内声明的变量和之外的变量无关,同样静态变量只会被初始化一次。

初始化

外部变量不进行初始化的话会直接初始化为0,而自动变量和局部变量没有进行初始化的话则视为没有定义(无用的信息)。

外部变量的初始化定义必须为常量表达式,不能包含其他已经定义的变量,相反自动变量和局部变量则可以包含

对于数组的初始化,外部变量的声明中如果后面的初始化表达式个数小于元数,那直接把多的元素初始化为0,相反对于局部变量则会引发错误

字符串数组声明比较特殊,可以直接用""来代替{}

C语言预处理器

#include " "和#include< >的区别

#include(文件包含指令)使得处理大量的#define指令以及声明更加方便,使得源文件里直接包含文件名指定的文件内容。

#include " "在源文件所在的位置查找该文件,如果没查找到该文件则根据相应规则查找该文件,

#include< >直接根据相应规则查找该文件

宏替换

#define 名字 文本将出现名字的地方都会被替换为文本,可以将较长行分为若干行,只需在待续行的末尾加上反斜杠\即可

#define宏定义的作用域是从定义点开始,然后一直到源文件的结尾

#define宏定义的不能对引号里面的字符串有用,如printf("YES")

#udef取消宏定义

#define也可以带上参数,这样就可以像实际参数一样,#define max(a,b) (a)>(b) ? (a) : (b)

条件包含

使用条件语句对预处理的语句进行判断,在预处理执行的过程中进行运算,可以在编译过程中根据计算所得的条件值选择性的包含不同的代码提供手段。

#if !defined(名字)……
#else / #endif / #elif……

defined(名字)表示当名字被定义,其值为1;否则,其值为0

#if !defined(HDR)
#define HDR
#endif

这样可以将每个头文件所依赖的其他头文件包含进来

C语言函数与程序结构的更多相关文章

  1. C/C++语言简介之程序结构

    C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数.因此, ...

  2. C语言函数不能返回数组,但可以返回结构体

    为什么C语言函数可以返回结构体,却不可以返回数组?有这样的问题并不奇怪,因为C语言数组和结构体本质上都是管理一块内存,那为何编译器要区别对待二者呢? C语言函数为什么不能返回数组? 在C语言程序开发中 ...

  3. JavaScript初探 四 (程序结构)

    JavaScript 结构 JavaScript 程序结构 JavaScript支持几乎和C语言一样的程序结构 分支结构 循环结构 分支结构 条件分支 if-else if语句:判断条件为true则执 ...

  4. 【C语言入门教程】1.1 基本程序结构

    基本程序结构就是从上至下顺序执行的程序,C语言程序必须有且只有一个主函数,程序从主函数开始执行,直到主函数结束.下例是根据半径求圆形面积的程序源代码. #include <stdio.h> ...

  5. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  6. 网易云课堂_C语言程序设计进阶_第6周:程序结构

    6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...

  7. [C语言]进阶|程序结构

    ------------------------------------------------------------------------------------ 全局变量: // main.c ...

  8. GO语言的进阶之路-go的程序结构以及包简介

    GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...

  9. C语言入门教程-(2)基本程序结构

    1.简单的C语言程序结构 要建造房屋,首先需要打地基.搬砖搭建框架(这大概就是为什么叫搬砖的原因).学习计算机语言的时候也一样,应该从基本的结构开始学起.下面,我们看一段简单的源代码,这段代码希望大家 ...

随机推荐

  1. hadoop各个名词的理解

    Hadoop家族的各个成员 hadoop这个词已经流行好多年了,一提到大数据就会想到hadoop,那么hadoop的作用是什么呢? 官方定义:hadoop是一个开发和运行处理大规模数据的软件平台.核心 ...

  2. mysql explain 分析sql语句

    鉴于最近做的事情,需要解决慢sql的问题,现补充一点sql语句性能分析之explain的使用方式! 综合返回数据情况,分析各个参数,可以了解sql 使用方法:explain  + sql语句 如 :e ...

  3. [解读REST] 5.Web的需求 & 推导REST

    衔接上文[解读REST] 4.基于网络应用的架构风格,上文总结了一些适用于基于网络应用的架构风格,以及其评估结果.在前文的基础上,本文介绍一下Web架构的需求,以及在对Web的关键协议进行设计和改进的 ...

  4. 传统 HTML 表单数据的“整存整取”

    在日常开发中,涉及表单的处理司空见惯.过往,在取值和赋值的过程中,借助 jQuery 常常只是逐个控件进行操作,可惜这样开发效率并不高.那么能不能批量获取整个表单的值呢,以及批量为表单赋值. 一.取值 ...

  5. python - 常用模块栗子

    前言  内容摘自Python参考手册(第4版) 及 自己测试后得出.仅作为一个简单记录,方便使用查询之用. 另 dir(func)及func.__doc__可以查看对象属性及说明文档. 序列Seque ...

  6. Android基础知识04—Activity活动之间传递数据

    ------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...

  7. Myeclipse10连接SqlServer2012

    本文纯手打!!!! 对于我们这些刚学java的小白,可是真费劲啊!!!! 要用java连接数据库  首先是要通过JDBC驱动 要先去下载一个sqljdbc4.jar,我这里放百度云盘了, 下载地址:链 ...

  8. Python实现正交实验法自动设计测试用例

    1.简介 正交试验法是研究多因素.多水平的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的.有代表性的点进行试验,这些有代表性的点具备了 ...

  9. LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)

    We define a harmonious array is an array where the difference between its maximum value and its mini ...

  10. Superset连接Impala数据源

    公司最近在superset上面做二次开发,目前对接了mysql和oracle数据源,对这两个源的SQL操作查询做了完善和兼容.目前有新的需求就是要对接大数据部门的HBASE和HIVE数据源,由于sup ...