------IOS培训期待与您交流! -------

一、变量

变量代表着一个有名字的、具有特定属性的一个存储单元,运行期间,变量的值是可以改变的。变量必须先定义,后使用。定义时,指定该变量的名字与类型。

变量名实际上是以一个名字代表的一个存储地址;而从变量中取值,实际上是通过变量名找到相对应的内存地址,再从该存储单元中读取相对应的数据。

刚刚提到了变量定义这个词,我们知道,在定义函数的时候,我们都会先对函数进行一个声明,这就又引用了一个概念:声明。

那么我们先来理解一下什么是声明和定义:例如:声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间,但是定义一个变量意味着在声明变量的同时还要

为变量分配存储空间,而在定义一个变量的同时还可以对这个变量进行初始化的操作。

我们可能会在下列3种情况下定义变量:

(1)在函数的开头定义;

(2)在函数内的复合语句中进行定义;

(3)在函数的外部进行定义

从变量的作用域的角度上来说,变量通常可分为:局部变量以及全局变量

(1)局部变量通常只定义不声明,而全局变量多在源文件中定义,在头文件中声明;

(2)局部变量可理解为:在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。不同的函数中可以使用同名的局部变量,它们代表着不同的对象,互不干扰。

(3)全局变量可理解为:在函数之外定义的变量称为外部变量,外部变量是全局变量,它可以为本文件中其他函数所共用,全局变量在程序的全部执行过程中都占用存储单

元,这样会减低程序的运行速度,并且也会使函数的通用性降低等等,因此,尽量少使用全局变量。

若是从变量值存在的时间(即生存期)来说的话,变量的存储有两种不同的方式:静态存储方式和动态存储方式,C的存类别分为4种,分别是:自动的(auto)、

静态的(static)、寄存器的(register)、外部的(extern)

(1)自动变量(auto变量):函数中的局部变量,其缺省格式是自动变量类型。

例如,在函数体中

int b, c=3; auto int b, c=3;

这两局代码其实是等价的。

自动变量是动态分配存储空间的,函数结束后就释放。自动变量如不赋初值,则它的值是一个不确定的值。

(2)静态局部变量(static局部变量):静态局部变量是指在函数体内声明和定义的局部变量,它仅供本函数使用,即其他函数不能调用它。

静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值。

静态局部变量在静态存储区分配存储单元,在程序的整个运行期间都不释放。静态局部变量是在编译时赋初值的,即只赋初值一次。

在SDT编译器中,建议对静态局部变量赋初值,否则该静态局部变量的初值为不确定值。在其他编译器中,未初始化的静态局部变量的初值可能为零,这由具体的编译器所决

定,使用前最好测试一下。

(3)寄存器变量(register变量):带register修饰符的变量暗示(仅仅是暗示而不是命令)编译程序本变量将被频繁使用,如果可能的话,应将其保留在CPU的寄存器中,

以加快其存取速度。

对于现有的大多数编译程序,最好不要使用register修饰符。因为它是对早期低效的C编译程序的一个很有价值的补充。随着编译程序技术的进步,在决定哪些变量应当被存到寄

存器中时,现在的C编译程序能比程序员做出更好的决定。

(4)外部变量(extern全局变量):定义函数中的全局变量时,其缺省格式是外部变量类型。外部变量应该在一个头文件中声明,在当前源文件中定义。

外部变量允许其他文件引用。

下例声明了一个变量和一个结构,定义了两个变量,其中一个定义带初始化:

extern int   decl1;   // this is a declarationstruct decl2
{int member;};       // this just declares the type – no variable mentionedint def1 = 8;   // this is a definitionint def2;   // this is a definition

二、函数

从本质意义上来说,函数就是用来完成一定的功能的,一个C语言程序可由一个主函数和若干个其他函数组成。而在程序中使用到的所有函数,同样必须先定义,后使用,

今天关于函数的定义以及使用的知识在这里就不详细说明啦,主要讲的是内部函数与外部函数的区别与使用。

(1)内部函数:内部函数的声明和定义多在当前源文件中完成;而外部函数通常在源文件中定义,在头文件中声明。格式:

static 类型名 函数名(形参表);例如:static int fun(int a , int b);

只在当前源文件中使用的函数应该说明为内部函数。内部函数应该在当前源文件中声明和定义。若内部函数在头文件中声明,其他源文件通过包含这个头文件也可使用这个函

数,但这样就失去了其做为内部函数的意义。

优点:使用内部函数,可以使函数只局限于所在文件。这避免了与其他源文件中可能出现的同名函数发生冲突。例:

File: function1.c#include “function1.h”static int stat_func(void);void MasterFunction(void)
{…rc = stat_func( );…}static int stat_func(void)
{…return rc;
}

(2)外部函数:格式如下:

extern 类型名 函数名(形参表);例如:extern int fun(int a , int b);

对于可在当前源文件以外使用的函数,应该在一个头文件中声明。其他源文件可通过包含这个头文件或进行声明来使用这些函数(推荐用前者)。

一个良好的编程习惯是在头文件中声明函数的原型。这可方便编译程序查错。定义函数时,缺省的函数类型是外部函数。如:

void fun2(void);extern void fun2(void);

其函数类型是等价的,但前一个是定义函数,后一个是声明函数。

小结

编写程序,尤其是大型程序时,建议采用上文所述的方法对不同的变量、函数进行必要的声明、定义。

做好这些细节上的事务,可以为您的编程、调试、移植等带来很大的方便。

转载于:https://www.cnblogs.com/waterfox/p/4367460.html

黑马程序员--C语言基础之--变量、内部函数与外部函数相关推荐

  1. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  2. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  3. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  4. 黑马程序员C语言基础(第三天)

    黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...

  5. 黑马程序员——C语言基础---基础语法

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  6. 黑马程序员--C语言基础之--scanf函数

    ------IOS培训期待与您交流! ------- 写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一. C语言本身并不提供输入输出的语句,输入输出操作 ...

  7. 黑马程序员--- c语言基础--基本语法

    **第一讲 c语言概述** 一. 计算机和软件常识 1. 计算机运行原理 1) 硬件基本组成:硬盘.内存.CPU 2) 各个部件之间的运作协调 计算机只能识别0和1 1) 0和1组成的指令 2) 0和 ...

  8. 黑马程序员——Java语言基础——关键字、表示符、常量、变量及数据的类型、运算符

    ---------------------------- android培训.java培训.期待与您交流! --------------------------------- Java是强类型的语言, ...

  9. 黑马程序员C语言基础(第六天)指针

    https://www.bilibili.com/video/BV1jW411K7v2/?p=70&spm_id_from=pageDriver 文章目录 指针 概述 内存 物理存储器和存储地 ...

最新文章

  1. 机器学习——深度学习(Deep Learning)
  2. web开发的java语言步骤_java web开发入门一(servlet和jsp)基于eclispe
  3. 世界上最稳定的系统——维稳就靠它了!
  4. iis worker process内存占用大_安卓模拟器磁盘空间占用大/内存空间不足
  5. 各种流行深度学习构架的性能对比
  6. CentOS 6.6 安装pip
  7. 数据结构——括号匹配问题
  8. linux怎么让cat运行,使用lolcat让你的Linux命令行出现七彩虹
  9. 台大李宏毅Machine Learning 2017Fall学习笔记 (8)Backpropagation
  10. gulp-API介绍
  11. 怎么批量修改文件后缀名?
  12. python-随机生成数据faker
  13. C++ setw() 函数
  14. 2021申请邓白氏编码最新操作手册
  15. (软考高级、高项)信息系统项目管理师(第三版)过关经验
  16. 帮你解决Kali Linux 外接无线网卡显示不出来的问题
  17. 利用watir自动化测试并截图,截图后保存
  18. 双分支定向耦合器 HFSS仿真
  19. 最新版gg服务器框架安装器,GG服务框架安装器最新版本
  20. Nodejs如何连接Mysql

热门文章

  1. 知识兔Excel教程:让同事看傻~这几个Excel技巧太牛了
  2. 35搜索插入位置之Leecode—《数组篇》(二分法)
  3. 一种融合CMMI和敏捷的策略的前进路线
  4. 基于python 的 ansys 二次开发-----借助pyansys安装包。
  5. DAY5:《鸟叔的linux私房菜》
  6. SwitchHosts安装使用
  7. Jmockit对类静态方法mock
  8. PAT (Advanced Level) Practice 题解代码 - II (1051-1100)
  9. JS中将对象转化为数组,数组转对象
  10. leetcode17题 电话号码的字母组合