C:变量与初始化

21 篇文章 0 订阅
14 篇文章 0 订阅

内存中供用户使用的存储空间分为三部分:程序区  、静态存储区、动态存储区。

C语言中每个变量有两个属性:第一数据类型;第二存储属性。

.........................................................................................................................................................................................

变量的分类:

        ①从空间上分配:从变量的作用域可以分成:局部变量和全局变量。

        ②从变量的存在时间(生存周期)可以分成:静态存储和动态存储。

 

静态存储:程序在运行期间分配固定的存储方式。

动态存储:程序在运行期间根据需要动态的分配存储空间。

 

全局变量全部存储在静态存储区。在程序开始执行过程中给全局变量分配空间,程序执行完毕就释放空间。程序执行过程中固定的分配空间,而不需要动态进行分配是释放。

 

动态存储区主要存放以下数据:函数的形参、自动变量(没有加static的局部变量)、函数调用的现场现场保护和返回值。

动态存储区的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。

 


局部变量(Local Variable):

           定义:在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效,再调用就是出错。

 

全局变量(Global Variable):

            定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。

 

Static Local Variable

Static Global Variable


①在main函数中定义的变量也是局部变量,只能在main函数中使用;同时,main函数中也不能使用其他函数中定义的变量。main函数也是一个函数,与其它函数地位平等

 

②形参变量在函数体内定义的变量是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。

③可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互补干扰,也不会发生混乱。

④在语句块(由一对{ }包含的若干条语句)中也可以定义变量,它的作用域只限于当前的语句块


auto 变量:

函数中的局部变量,如果不专门的声明为 static存储,都是动态分配存储空间。数据存储在动态存储区内。函数中的形参和函数中的变量都属于此类,调用该函数时候系统自动的分配空间,在函数结束的时候,释放该空间。这些局部变量被称为自动变量。自动变量用 auto关键字声明(可以省略auto )。

 

static 变量:

有时候希望我们调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。

对静态局部变量的说明:

1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。

2) 静态局部变量在编译时赋初值,即只赋初值一次;对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。对自动变量来说,如果不赋初值则它的值是一个不确定的值。

 

register变量:

为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

 

说明:

1) 只有局部自动变量和形式参数可以作为寄存器变量;

2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;

3)局部静态变量不能定义为寄存器变量。

 

用extern声明外部变量:

外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作”外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。




C 语言的堆与栈

 

堆和栈的第一个区别就是申请方式不同:

        栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。

        堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。

由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。




:::错误实例:::

int a = 10;

int b = 10;

int c = a+b;

ERROR:赋值语句需要有函数执行,c语言最基本的执行体是函数,你可以初始化,但不能在函数体外赋值。 初始化必须是一个常量!!!


int a;

a = 10;

a = 15;

ERROR:

 

int a;

a = 10;

PASS:

 

函数体外只能进行初始化,不能进行赋值运算。为什么第二个程序可以执行?

 

因为,C语言执行过程中,对代码进行了优化,把程序1中的 int a; a=10;  优化为一句话:int a=10;这就是初始化。所以程序1是正确的。

程序2中,初始化过程中:int a=10;int a=15; 肯定就出错了重复初始化!




C与C++变量的初始化

C 中:

        全局变量存放在全局数据区,由编译器建立,如果在定义的时候不做初始化,系统会将其自动初始化,数值型为0,字符型和指针变量会自动赋值为NULL。静态变量和全局变量类似。而非静态局部变量不做初始化,它的值将是随机数

C++中:

        如果在一个文件中定义了int a=5,要在另一个文件中定义int b = a的话,前面必须对a进行声明:extern int a,否则编译不通过;

        即使是这样,extern int a ; int b = a;这两句话也是分两步进行的,在编译阶段,编译器把b当做是未初始化数据而将它初始化为0,在执行阶段,在main被执行前有一个全局对象的构造过程, int b = a,被当作是int型对象b的拷贝初始化构造来执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值