C语言学习之变量存储

本文标签C里的指针

本文转自:http://zhidao.baidu.com/question/42163882.html,作者不详,本人做了些简单的文字编辑。

C语言中对变量的说明包括两方面的内容:变量类型以及变量的存储类型。变量类型如:int(整形),char(字符型)是用来说明变量所占用的内存空间的大小。变量存储类型用来说明变量的作用范围。

C语言的变量存储类型有:自动类寄存器类静态类外部类

局部变量是指在函数内部说明的变量(有时也称为自动变量),用关键字auto进行说明。 所有的非全程变量都被认为是局部变量,所以auto实际上从来不用。局部变量在函数调用时自动产生,但不会自动初始化, 随函数调用的结束,这个变量也就自动消失了,下次调用此函数时再自动产生,还要重新赋值,退出时又自动消失。

静态变量用关键字static声明。根据变量的类型可以分为静态局部变量静态全程变量

(1)静态局部变量 
它与局部变量的区别在于:在函数退出时,这个变量始终存在,但不能被其它函数使用,当再次进入该函数时,将保存上次的结果。其它与局部变量一样。
(2)静态全程变量
静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是:全程变量可以再说明为外部变量(extern),被其它源文件使用,而静态全程变量却不能再被说明为外部的,即只能被所在的源文件使用。

外部变量用关键字extern声明。为了使变量除了在定义它的源文件中可以使用外,还可以被其它文件使用,就要将全程变量通知每一个程序模块文件,此时可用 extern来说明。

寄存器变量通常在比较注重在执行速度的情况下使用。其思想是告诉编译程序把该变量放在某个CPU寄存器中。因为数据在寄存器中操作比在内存中快,这样就提高了程序代码的执行速度。寄存器变量的说明是在变量名及类型之前加上关键字register。值得注意的是取地址运算符&不能作用于寄存器变量。

下面结合具体代码来分析一下变量的种类。

file1.c 
#include <stdlib.h> 
#include <stdio.h> 
int reset(); 
int next(); 
int last(); 
int sum(int ); 
int i=1; 
void main() 
{ 
    auto int i,j; 
    i=reset(); 
    for(j=1;j<=3;j++) 
    { 
        printf("i=%d/tj=%d/n",i,j); 
        printf("next(i)=%d/n",next()); 
        printf("last(i)=%d/n",last()); 
        printf("sum(i+j)=%d/n",sum(i+j)); 
    } 
} 
file2.c文件 
static int i=10; 
int next() 
{ 
    return(i+=1); 
} 
int last() 
{ 
    return(i-=1); 
} 
int sum(int i) 
{ 
    static int j=5; 
    return(i=j+=i); 
} 
file3.c文件 extern int i; reset() { return(i); }

在file1.c的开头声明i是全程变量,并初始化为1。而在main函数内部,说明了两个自动变量i和j,这样在main内部出现的i就是自动变量。

在file3.c的开头说明i是外部的,表明它与file1.c定义的i是同一个变量,所以reset的值返回的就是这个i的当前值1。

file2.c文件一开始就定义了变量i,并声明为静态变量,因此它的使用范围只在当前文件中使用。然而从函数sum中定义来看,其内部用到的i是形式参数,j是内部静态变量,它们与以前的i, j都不同。

具体执行过程分析如下:

(1)首先程序经过编译后生成可执行文件,运行可执行文件后,函数从Main函数体进入,在初始化的过程中得到i为全局变量,初值为1。
(2)进入main函数后首先调用函数reset(),进入文件file3.c,文件file3.c声明i为外部变量,所以此时i的值为1,则返回的值为1。函数reset()执行完后返回主函数,继续执行循环体中的程序。
(3)循环体首先调用函数next(),程序进入file2.c文件,判断i为静态变量,所以此时i的值为10,执行next()之后i的值为11,返回值为11,并将11作为i的值。当调用last()函数时,判断i的值为11,执行函数后,i的值变为10,并将10作为i的值。最后执行函数sum(i),此时值的注意的是执行程序时传递的是形参,即第一次调用时实际计算的值为sum(i+j=2),这样调用函数sum(i)后执行的结果为i=5+2=7,即为执行的结果。
(4)依次类推,分别为7,10,14。 通过以上的程序可以理解不同的存储类型的作用范围不同,在程序设计中如何灵活的使用各种不同的存储类型是能够使程序更灵活。

附:运行结果
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值