我对C语言变量的一些认识

原创 2006年06月04日 06:02:00

       从本质上讲,变量是程序中用来存放信息的一块空间。“这块空间”一词,还要加两个定语。一是所存放的内容是可以(通过代码来)改变的;二是它的地址是可以访问的(否则就无法用代码来访问它)。这就引出一连串与变量有关的许多问题。

       变量有两个属性。一是它的数据类型,就是这个空间能用来存放哪种类型的数据;二是它的时空属性。本文只涉及及后者。时就是变量的生命期,空就是变量的作用域。

       C中有两类变量:在任何函数外面定义的外部变量和在某函数内定义的自动变量。

       尽管在大多数C书里大谈特谈全局变量,但是,事实上,在C标准里,从没定义过全局变量。C的创建者这么安排,是有用意的。这体现了C创建者的一个重要思想:尽一切可能限制变量的作用域。他们想限制的还有变量的生命期。这一思想贯穿了整个C标准,也成为后来才出现的结构化程序设计思想的重要内容之一。

       外部变量是源文件级变量。就是说,它的作用域仅限于定义它的那个源文件。在源文件A里定义的一个外部变量,你要在源文件B里访问它,必须在文件B的开头用关键字extern声明它。注意定义和声明两个词,在经典的C书里,是很小心地区别开的。定义的实质是创建,本质上就是要申请一块存储空间。而声明不引发存储分配。这里的声明,只是使源文件A里的某变量的作用域延伸到源文件B里。

       在一个工程里,外部变量必须在一个源文件里定义,在其它也需访问它的每个源文件里要extern声明它。

       在工程里,如果你在某源文件里定义一个变量,并在其它所有源文件里声明它,这个变量就成了全局变量。因此,在C里,全局变量是靠你自己做出来的。

       在小组开发中,如果你不希望你定义的外部变量被其他人访问,可以在定义时加上修饰词static。这样,这个外部变量的作用域就仅限于定义它的那个源文件了。如果在其它源文件里用extern声明它,编译时就会报错。一个外部静态变量就是一个真正的文件级变量。

       外部变量的生命期是工程的整个运行期间(这里仅仅指静态分配的变量,动态分配的不一样。)。有些书里称之为“永久”。

       自动变量分两级。在函数头部定义的是函数级,作用域是整个函数;在代码块头部定义的是代码块级,作用域仅限这个代码块。自动变量在机器执行到定义它的那个函数(或代码块)时被创建,离开函数(或代码块)时自动消失。再次进入该函数(或代码块)时,被再次创建。这就是“自动”的意义。因此,自动变量的生命期仅限该函数(或代码块)的一次运行过程。如果在定义时加修饰词static,就成了自动静态变量。自动静态变量的作用域不变,生命期变成永久(整个工程运行期)。自动静态变量必须有一个初值,作为该函数(或代码块)在第一次运行时变量的初值。以后的运行,每一次的初值都是上一次的终值。

       不同作用域的变量允许同名。如果两个同名变量的作用域互不相交(譬如分处两个源文件的的两个外部静态变量),那当然互不搭界。如果一个作用域包含另一个作用域,则在程序运行时,会发生屏蔽现象。当进入内层时,外层的变量被内层的同名变量屏蔽。即这时实际访问的是内层变量。当内层终止时,外层变量便又显露出来。

       C++里,不再限定变量只能在代码块的首部定义。这有什么意义呢?假如,在一个代码块里需要定义一个变量,但是那个变量只是在代码段快终结处才被使用。如果在变量将使用时才定义它,就可以最大限度地限制它的作用域。另外的好处是代码可读性更好。因为如果代码块很大,定义和引用贴在一起,有利于程序的理解。新的C标准也扩充了这一点。

(过去写的短文)

深入理解C语言变量和内存——整理篇

1、基本数据类型变量名和内存的关系:  int i;   scanf_s("%d", &i);int i;,在这一句就为i分配了内存(但尚未对这块内存进行初始化),所以可以通过&i直接使用这块内存。赋...

三种内存分配模式

系统为进程分配数据空间有三种形式。静态分配整块静态分配空间,包括其中的所有数据实体,都是在进程创建时由系统一次性分配的(同时为UNIX称为Text的代码分配空间)。这块空间在进程运行期间保持不变。初始...
  • beepbug
  • beepbug
  • 2006年06月23日 20:32
  • 2927

C/C++没有数组

在其它高级语言里,不管是定义(声明)还是引用,a[i]或a[3]都是一个整体。在C/C++里,却是一个表达式:a[i]是运算符[]连接两个实体a和i。说C/C++并没有数组,有以下几条理由。理由一:C...
  • beepbug
  • beepbug
  • 2006年06月06日 20:51
  • 4354

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针。来看个小案例 #include #include /** 指针就是内存地址 内存地址就是指针 */ main(...
  • a_zhon
  • a_zhon
  • 2016年11月23日 16:57
  • 648

单片机c语言变量的定义和赋值

[存储种类] 数据类型 [存储器类型] 变量名表   在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器...

C语言:全局变量、静态变量static、外部变量extern的区别

全局变量int i是在整个工程可见的,但是在另外文件是不能用(假设工程是由两个源文件1.cpp、2.cpp链接而成,全局变量定义在1.cpp,而2.cpp不能用,虽然可见),要想在2.cpp用,必须在...
  • newthon
  • newthon
  • 2015年01月14日 11:34
  • 4296

C语言之交换两个整型变量的值(四种方法)

C语言中有一道题目是交换两个整型变量的值,这是一道非常简单的题目,那么一共有几种方法呢?以下是我整理的四种方法,是在MAC系统x-code环境下编译并运行成功的,以下为截图: 方法一:通过引入第三方...

C语言 变量的作用域和生命周期

C语言 作用域和生命周期a.普通局部变量属于某个{},在{}外部不能使用此变量,在{}内部是可以使用。执行到普通局部变量定义语句,才会分配空间,离开{},自动释放。普通局部变量不初始化,默认值为随机数...

c语言中变量的引用传递和指针

掌握了引用型变量和指针,才能深入掌握面向过程的函数调用机制。 引用型变量存储的是变量的地址,指针存储的也是变量的地址,所以本质上来说二者是一样的。 使用引用型变量,子函数中所有的操作会直接修改主函数中...

C语言外部变量的使用以及erxtern的用法

网上有很多帖子问C语言中extern的用法,而且回答的详细程度各尽不同. 所以我就像写一篇博文来谈谈我对extern的看法,不一定十分恰当,只当大家共勉.变量定义性声明和引用性声明变量的声明有两种情况...
  • gatieme
  • gatieme
  • 2015年03月27日 18:21
  • 11401
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我对C语言变量的一些认识
举报原因:
原因补充:

(最多只允许输入30个字)