C语言变量

任何一种编程语言都离不开变量,特别是数据处理型程序,变量的使用非常频繁,没有变量参与程序甚至无法编制,即使编制运行后的意义也不大。变量之所以重要,是因为变量是编程语言中数据的符号标识和载体。

C语言是一种应用广泛的善于实现控制的语言,变量在C语言中的应用更是灵活多变。那么变量究竟是什么呢?变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号我们在交流中就可方便言表,否则,我们只可意会,那多不方便。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,基本可以望名知义,便于交流和维护;其次,变量是唯一确定的对应内存若干存储单元或者某个寄存器。这些是编译器来保证的,用户一般不用费心。

程序员一旦定义了变量,那么,变量就至少可为我们提供两个信息:一是变量的地址,即就是,操作系统为变量在内存中分配的若干内存的首地址;二是变量的值,也就是,变量在内存中所分配的那些内存单元中所存放的数据。

由于程序的多样需要,我们对变量也有各种各样的要求,比如:变量的生命期,变量的初始状态,变量的有效区域,变量的开辟地和变量的开辟区域的大小等等;为了满足这些要求,C语言的发明者就设置了以下变量:

1、 不同数据类型的变量;如:char cHar, int iTimes, flaot faverage;
2、 全局变量或者叫全程变量;
3、 局部变量;
4、 静态变量: 静态全局变量和静态局部变量;关键词:static
5、 寄存器变量;关键词:register;
6、 外部变量: 关键词:extern;

C语言中,变量在内存中开辟地的大小由数据类型决定的,由于PC机中规定一个地址单元存一个字节,不同的数据类型的变量,为其分配的地址单元数是不一样的。C语言中除几种基本的数据类型外用户还可以自己定义所需要的数据类型:

1、 bool型 sizeof(bool): 1

2、 char型: sizeof(char): 1

3、 short型: sizeof(short): 2

4、 int型: sizeof(int): 4

5、 long型: sizeof(long): 4

6、 float型: sizeof(float): 4

7、 double型: sizeof(double): 8

8、 自定义型:如:

typedef struct tagMyData
{
char cHar;
int iTimes;
float faverage;
}MyDatap;
sizeof(MyDatap): 12
char szBuf[]="HELLO C&C++!";
sizeof(szBuf): 13

局部变量和全局变量是相对而言的;如下:局部变量 int itmp;

int Get_Max( const int& x, const int& y, const int& z )

{
int itmp;
if(x > y) itmp = x;
else itmp = y;
if( itmp > z ) return itmp;
else return z;
}

在函数内部说明的变量为局部变量,只有在函数执行时,局部变量才存在,当函数执行完退出后,局部变量随之消失。也就是,当函数执行完退出后,原先在函数内定义的变量现在不能用,这通常由编译器保证,它会阻止编译通过。也就是说,原来为那个局部变量分配的内存,现在已经不属于它,它再无权访问了。如要再使用这些内存单元就必须从新定义变量来申请,只有分配给的变量才可访问它。否则,就会出错,如数组越界访问。

与局部变量不同,全局变量在整个程序都是可见的,可在整个程序运行过程中,对于任何一个程序都是可用的。全局变量的说明的位置在所有函数之外,但可被任何一个函数使用,读取或者写入。

如下:全局变量 int iCount, bool bForward;

int iCount; //全局变量;
bool bForward; //全局变量;
void add(void);
void dec(void);
void man(void)
{
while(iCount < 1000 && iCount > -1000)
{
add();
dec();
printf("COUNT:%d;\n", iCount)
}
}
void add(void)
{
if( bForward ) iCount++;
}
void dec(void)
{
if(!bForward ) iCount--;
}

可见,全局变量非常方便不同函数间数据共享,同样,任何函数在在使用数据时,都不敢保证数据是否已被修改。如果程序员无法保证这个,就尽量避免使用全局变量。

静态变量是分配在存储器中C程序所占据的数据段内,

C程序运行的整个过程中一直保留,不会被别的变量占用。静态变量可以定义成全局变量或局部变量,当定义为全局变量时,在它定义的程序的整个运行期间均存在并且保持原来的存储单元位置不会改变。那么既然有了全局变量为什么还要定义全局静态变量呢?看下边的示例:

模块1:

int a;
static int b;
void fun1( void )
{
……
fun2( );
……
}

模块2:

extern int a;
satic int b;
void fun2( void )
{
……
fun1( );
……
}

分别编译,然后链接两个模块。。。。。。

模块1和模块2中,变量a为同一个变量;而变量b就不是同一个变量!虽然它们的的数据类型和名称均相同;就是因为有static;原因是,如果在全局变量说明前加上静态变量说明符static,它就会通知编译器该全局变量只在被定义的这个文件或模块中可见的。就是说,该静态全局变量在其他文件中是不可见的,在其他文件中的程序是不允许访问的。这在一定程度上减少了全局变量的副作用的影响。

同静态全局变量定义一样,当在局部变量名前加静态变量说明符static,该变量就定义为静态局部变量。编译器为该变量建立永久存储单元。永久是指C程序运行的整个过程中一直保留,不会被别的变量占用。静态局部变量和静态全局变量的根本区别在作用区域上,静态局部变量只在它被说明的函数或复合语句中有效,并且在两次函数调用期间仍然保存其值不变,即就是有记忆功能;它们的生命期是相同的,和C程序整个运行期同在。如下例:

#include <stdio.h>
void counts(void);
void countd(void);
int main(int argc, char* argv[])
{
int i = 0;
while( i++<10)
{
counts( ); //使用静态局部变量
}
i = 0;
while( i++<10)
{
countd( ); //使用局部变量
}
return 0;
}
void counts(void) //使用静态局部变量
{
static int isc ; //未赋初值;
isc++;
printf("isc = %d;\n", isc);
}
void countd(void) //使用局部变量
{
int idc = 0;
idc++;
printf("idc=%d;\n",idc);
}

执行结果为:

isc = 1; //使用静态局部变量
isc = 2;
isc = 3;
isc = 4;
isc = 5;
isc = 6;
isc = 7;
isc = 8;
isc = 9;
isc = 10; idc = 1; //使用局部变量
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;

通过以上程序你也看得出:

1、 局部变量和静态局部变量的区别:记忆功能;

2、 静态局部变量只初始化一次,并且默认初始化为0;

静态变量在定义时若未被赋值,则编译程序将其初始化为0;

寄存器变量不像其他变量那样在内存中存放数据,而是在CPU的寄存器中暂存数据,使用寄存器变量比使用内存变量的操作速度快得多。只有整型和字符型变量可定义为寄存器变量。定义方式如下:

register int iTemp;

由于CPU中寄存器有限,尽量减少使用数量和和占用时间,用完马上释放;不能定义为全局变量,也不能定义在结构或者类中。

为了大型程序的管理,将一个大型的程序分成若干个独立的模块和文件分别编译,然后统一链接在一起。为了解决全局变量和函数的共用问题,就引入了extern关键字。这样只需在一个文件中定义全局变量和函数,在另一个文件中要用到这些变量和函数时,只需将那个文件中的变量和函数说明表复制过来,在前面加上extern,告诉编译器,这些变量和函数已经在别的文件中定义说明,在此不必再定义说明了。

C语言变量的更多相关文章

  1. [C语言 - 2] C语言变量

    A.变量的作用域: 1.局部变量:在函数或者代码块内部定义的变量 作用域:从定义处到代码块结束 生命周期:从定义处分配控件,代码块结束后被回收 局部变量没有默认值,要自己初始化   2.全局变量:在函 ...

  2. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

  3. 模板语言变量,js变量,js自执行函数之前嵌套调用

    1.模板语言变量 前端html页面中展示 {{ nodeIp }} 2.js变量引用模板语言变量 把模板语言变量传递给js,js去执行页面操作(变量的转换,只适用于字符串) var IP = &quo ...

  4. Go 语言变量

    变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关键字: ...

  5. go语言变量

    变量可以通过变量名访问 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字 声明变量的一般形式是使用 var 关键字: var identifier type 变量声明 1. 指定变量类 ...

  6. C语言变量声明内存分配

    转载: C语言变量声明内存分配   一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  7. C语言变量的类型和存储位置

    . C语言变量主要分为全局变量.静态全局变量.局部变量.静态局部变量和寄存器变量.其中静态变量用static关键字进行修饰.程序所占用的内存可以分为以下几个部分: ()代码段-存放程序代码,只读的,不 ...

  8. C语言变量的初始化

    关于C语言变量是否需要初始化的问题.以前西北工业大学的C语言老师说的是,需要初始化,如果不初始化就使用的话,变量的值是以前遗留在内存中的,是不确定的(这只是针对局部变量的).C语言全局变量如果没有初始 ...

  9. Go语言【第八篇】:Go语言变量作用域

    Go语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围,Go语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量: 函数外定义的变量称为全局变量: 函数 ...

  10. C语言变量长度在32位和64位处理器上的关系

    C语言变量长度在32位和64位处理器上的关系       理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算).常用数据类型对应字节数 ...

随机推荐

  1. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  2. 图解HTTP权威指南 | HTTP报文

                                                                                    一.问题 1.报文流是如何流动的 2.H ...

  3. Azure Databricks 第一篇:创建工作区、集群和Notebook

    Azure Databricks是一个可扩展的数据分析平台,基于Apache Spark.Azure Databricks 工作区(Workspace)是一个交互式的环境,工作区把对象(noteboo ...

  4. JavaScript之函数原型链完整版

    我的上一篇文章有解释绅士原型及简单的原型链,在这里我将对原型链做完整讲述: // 函数的原型链: 把函数当对象(实例对象)来看 function Person(){} // 底层Function创建出 ...

  5. 生成对抗网络(Generative Adversarial Networks, GAN)

      生成对抗网络(Generative Adversarial Networks, GAN)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的学习方法之一.   GAN 主要包括了两个部分,即 ...

  6. WEB层知识点

    目录 Web 应用程序技术 HTTP 1.1 HTTP请求 1.2 HTTP响应 1.3 HTTP方法 1.4 URL 1.5 HTTP消息头 1.常用消息头 2.请求消息头 3.响应消息头 1.7 ...

  7. 深入浅出 Git

    开篇 你可能遇到过 如果你遇到这个场景,那你可能需要版本控制. 什么是版本控制 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实地了已录下来.每一次文件的改变 ...

  8. jmeter+jdk环境配置

    一:JDK 安装配置:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html  ,下载JDK8 安装 1. ...

  9. 【mysql】- Expalin篇

    简介 id:在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的id 与查询优化器有关,假如被优化过,那么可能是上下两个的id都是一样的 select_type:SELECT 关键字对应的那 ...

  10. Java 从匿名内部类到Lambda表达式

    匿名内部类和Lambda表达式有很多类似之处,首先都是在使用的时候才对接口进行实现,只是Lambda接口中只能由一个需要被实现的方法. 所有的Lambda表达式都可以 由匿名内部类改写: interf ...