C程序函数相关知识

1、主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或者多个函数调用任意多次。所有的函数都平行的,是相互独立的。一个函数并不属于另一个函数,即函数不能嵌套定义,但是可以嵌套调用函数(也就是说,在调用一个函数的过程中,又调用另一个函数)。函数之间可以相互调用,但不能调用main函数。main函数是被操作系统调用的。

2、在定义函数时指定函数的类型为void,意为函数无类型,即无函数值,也就是说,执行函数后不会把任何值带回函数

3、函数声明应当在main函数之前或者main函数中的开头部分,对函数进行声明。函数声明的作用时是把有关函数的信息(函数名、函数类型、函数参数的个数与类型)通知编译系统,以便在编译系统对程序进行编译时,在进行调用函数时知道它们是函数而不是其变量后或者其他对象。

4、函数体包括声明部分语句部分。声明部分包括对函数用到的变量进行定义及对要调用的函数进行声明。

5、在函数调用过程中,系统会把实参的值传递给被调用函数的形参。(形参从实参得到一个值)。该值在函数调用期间有效,可以参加函数中的运算。在调用函数过程中发生的实参和形参间的新数据传递,常称为“虚实结合”。

6、实参可以是常量、变量或表达式,例如:max(3,a+b),但是要求它们有确定的值。在调用时将实参的值赋给形参。

7、实参和形参的类型应该相同或者赋值兼容。(字符型与int型可以相互通用)。

8、如果函数不需要返回值,则不需要return语句。这是函数的类型应定义为void类型。

9、函数调用结束,形参单元被释放。注意:实参单元仍保留并维持原值,没有改变。如果在执行一个被调函数时,形参的值发生改变时,不会改变主调函数的实参的值。这是因为实参和形参是在两个不同的单元存储单元实参向形参的数据传递是“值传递”,单向传递,只能由实参传递到形参,而不能由形参传递给实参。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值)。

       注意:函数调用只能带回一个函数返回值

10、实际上,在函数声明中的形参名可以省略,而只写形参类型。编译系统只关心和检查参数个数和参数类型,而不检查参数名,因为调用函数时只要求保证实参类型与形参类型一致,而不必考虑形参是什么。

11、对函数的“定义”和“声明”不是同一回事。函数的定义是指函数功能的确立,包括指定函数名、函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的、函数单位。而函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知百衲衣系统,以便在调用该函数时系统按此进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包含函数体

12、数组元素也可以用作函数实参,但是不能用作形参(因为形参是在函数被调用时临时分配存储的单元,不可能为一个数组单独分配存储单元,而数组时一个整体,在内存中占连续的一段存储单元),其用法与变量相同,向形参传递数组元素的值。此外,数组名也可以作实参和形参传递的是数组第一个元素的地址

13、数组名代表数组的首元素的地址

14、如果将实参元素的地址传给形参元素,则实参和形参的元素就共占同一段内存单元,接下来,无论是实参元素地址发生了改变还是形参元素地址发生了改变,另一个参数的地址最终都会随着改变。(终于明白了调用swap这个函数时,元素没取地址和取地址是怎样工作的,泪目了,困惑老夫多日的疑惑终于解开了)

15、数组是按行存放的,因此,在定义数组时,必须指定的列数(即一行中包含几个元素)。

16、主函数中定义的变量也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量

11、不同函数中可以使用同一个变量名,它们分别代表不同的对象、互不干扰。

12、形参也是局部变量。

13、在一个函数内部,可以在复合语句中定义变量,但是这些变量自在本复合语句中有效,这种语句也叫“分程序”或“程序块”。

14、在函数内定义的变量是局部变量,在函数外部定义的变量是外部变量,外部变量叫全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共有。它的有效范围从定义变量的位置开始到本源文件结束。

15、什么是本源文件:程序编译单位是源程序文件,一个源文件可以包含一个或者若干个函数。

16、在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量(函数只能使用在其之前定义的全局变量而不能使用在其之后定义的全局变量,所以说可“有效的全局变量”)。

17、不建议在必要时使用全局变量,原因如下:

a、全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要使用时才开辟单元;

b、它使函数的通用性降低了,因为如果在函数中引用了全局变量,那么执行情况会受到有关的外部变量影响,如果将一个函数移到另一个文件中,还要考虑把有关的外部变量及其值一起移过去。但是若该外部变量与其他文件的变量同名时,就会出现问题,这就降低了程序的可靠性和通用性;

c、使用全局变量过多,会降低程序的清晰性。

18、变量的存储有两种方式:静态存储方式动态存储方式。静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态分配存储空间的方式。

19、用户区的存储空间可以分为3个部分:程序区、静态区、动态区。

20、数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。

21、在动态存储区(分配和释放都是动态的)中放以下数据:

a、函数形参在调用函数时给形参分配存储空间;

b、函数中定义地没有使用关键字static声明地变量,即自动变量;

c、函数调用时的现场保护和返回地址等。

22、如果一个程序中两次调用了同一个函数,而在此函数中定义了局部变量,在两次调用时分配给这些变量的存储空间的地址可能时不同的

23、在C语言中,每一个变量和函数都有两个属性:数据类型(int float char.....)、数据的存储类别。存储类别是指数据在内存中存储的方式(如静态存储和动态存储)。

24、C的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别,可以知道变量的作用域和生存期。

下列为4种存储类型的具体介绍:

a、auto:

b、static

       对静态局部变量是在编译时赋初值,即只赋初值一次,在程序运行时它已由处置。以后每一次调用函数时不再重新赋初值而只保留上次函数调用结束时的值。而对自动变量赋初值,不是再编译时进行的,而是在函数调用时进行,每调用一次函数就重新给一次初值,相当于执行一次赋值语句。

       如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译自动赋初值0(对数值型变量)或者空字符‘\n’(对字符变量)。对于自动变量来说,它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的内容是不可知的。

       虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能调引用它的。因为它是局部变量,只能被本函数引用。

c、对于一些局部变量如果使用频繁(例如用了函数执行了1000循环,每次都循环都要引用某局部变量),此时允许该变量的值放在CPU中的寄存器。

       总结:自动变量存储在动态存储区;静态局部变量存储在静态存储区;寄存器存储在CPU中的寄存器中

25、一般来说,外部变量是在函数的外部定义地全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在定义之前的函数不能引该外部变量。但是有方法扩展全局变量的作用域,同时也有方法限制全局变量作用域。

26、用static声明一个变量的作用是

a、对局部变量用static声明,把它分配在静态区,该变量在整个程序执行期间不释放,其所分配的空间始终存在;

b、对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。

       注意:auto、register和static声明变量时,实在定义变量的基础上加上这些关键字,而不能单独使用。(int a;   static a;     先定义变量类型,再企图对变量进行声明,这样写是错误的,编译时会被认为“从新定义”)

27、一般为了叙述方便,把建立存储空间的声明称为定义,把不需要建立存储空间的声明称为声明(狭义)。

28、所谓“声明”,其作用是声明该变量是一个已在其他地方已定义的外部变量,仅仅是为了扩展该变量的作用域而作的是“声明”。

       注意:有一个简单的结论,在函数中出现的对变量的声明(除了extern声明的以外)都是定义。在函数中对其他函数的声明不是函数的定义。

29、C语言规定,如果在定义函数是省略extern,则默认为外部函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值