数据的存储类型和函数作用域与生存周期

一  A.函数分类:1主调函数                  2被调函数

B. 函数不可嵌套定义,即不可在函数内定义函数,但可以嵌套使用,即在函数内调用其他函数;每个函数体都有且只有一个主函数,可以有若干个被调函数和主调函数。

C. 函数分为声明和引用两部分

a.声明:函数返回值类型(可以为void,int,double,float,char指针)函数名(函数形参列表);

b.引用:

     1 . 函数传递的实型参数在接收时可以改变名字,以形参列表的顺序依次接收。

     2 . 函数的返回值应与函数返回值类型相同。

3 . 函数内申请定义的变量为默认为动态存储变量,作用域为申请处外面最近的这个花括号内。

4 . (1)函数实参:在主调函数中申请,若为变量定义时分配空间,生存周期为该主调函数,可以是常量,变量,表达式,函数之一,将传递给被调函数中的形参。由于要传输给形参,因此实参在传输前必须为确定的值,或者确定的地址,并且形参与实参的传递是单向的,对应的,即从实参单项传递给形参,一对一接收,若不对应,则报错,类型不匹配

 (2)函数形参:在函数声明中定义,定义时不分配空间,在函数调用时分配空间执行操作,开始其生存期,函数调用结束释放,结束生存期,函数形参为动态变量,不能为静态变量。

5 . 函数实参传递给形参,调用结束被调函数内的值释放,但若实参为指针,其传递的是实参地址,形参接收后在被调函数内的访问也就是访问的实参地址,此时对形参的操作就是间接的操作实参,在函数调用结束后实参的操作结果有效,实参内容可以在形参的调用中改变.

二.数据的存储类型:

       A数据的存储类型:

  a根据变量在程序中的声明位置的不同,空间上分为:局部变量和全局变量

  1全局变量:任何在代码块之外申请的变量都可以理解为全局变量,该变量为静态变量不能指定其他存储类型,申请后若无初始值默认赋值为0,其作用域为申请处一直到程序结束,它始终保持固定的值除非给它赋其他值改变其值,它的值为该语句前上一次所赋的值

  2局部变量:在代码块内部申请的变量缺省为自动变量(auto),当程序执行到语句块时它被创建,在语句块执行期间存在,执行流离开后销毁。在定义前面加上关键字static可以将变量类型定义为静态变量,生存周期从申请处到程序结束,但它的作用域依旧为该代码块内按名字访问。

b根据在内存中存储位置的不同,其生存周期的不同分为:动态存储变量和静态存储变量

1静态变量(static):

(1)     (1)局部静态变量:在代码块内申请,生存周期从申请处开始到程序结束,但是作用域在申请的这一函数内,多次调用时,它的赋值只进行一次,后面每次调用重新赋值的赋值语句忽略,函数调用结束后停止访问,不可使用;

(2)     (2)全局静态变量:存储在静态存储区中,在程序运行前申请,生存周期从申请处开始到程序结束,作用域贯穿整个程序,每个函数都可以使用它,生存周期到程序结束为止。

2动态变量:

(1)     (1)auto型变量:存储在普通内存区域,在代码块内申请,在语句块执行期间存在,执行流离开后销毁。如果该语句块被反复调用,这些自动变量每次都重新创建未开辟的内存空间中的某一处大小相同的空间,因此两次调用的存储地址可能相同,也可能不同。

(2)     (2)register型变量:存储在寄存器中,在代码块中申请,也是自动变量,不过因为它在寄存器中占用内存,所以访问时比访问auto型变量快,若函数中需要多次使用某个变量,则可以把它申请为寄存器变量,加快速度,寄存器变量的申请占用有个数限制,试想下,如果大型程序中全为寄存器,那么寄存器能存下吗,所以寄存器在寄存器变量过多时只会选取其中前几个存入寄存器,其余作为一般自动变量存入内存。但是有的编译器将寄存器变量识别为一般auto型变量,申请寄存器变量不会提升程序运行速度。

猜你喜欢

转载自blog.csdn.net/klaus_1998/article/details/80464802