C语言学习笔记_5函数与程序结构

本文详细介绍了C语言中函数的定义、返回值、声明等概念,解释了函数调用与参数传递的过程,探讨了作用域与可见性的规则,并阐述了不同存储类型的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****************************************************************************
*第五章函数与程序结构
*****2016年1月20日11:08:59
*韩–
*概述:
1、函数的定义域函数原型
2、函数调用与参数传递
3、作用域与可见性
4、存储类型
****************************************************************************/

1、函数的定义与函数原型

1-1函数的定义

    C99标准要求任何函数都必须明确指定返回类型,不允许像C89那样默认返回int
    与变量定义不同,每一个形参都必须带有数据类型和名字
    养成良好的习惯,在每个函数的顶端用“/*……*/”格式注释
    函数的命名要选择有意义的名称

1-2函数的返回值

    return 表达式;
    表达式的值的类型应该与函数定义的返回值的类型一致:
        基本类型:如果不同,自动转化为函数类型
        指针类型:如果不同,必须使用强制类型转换运算符将表达式的类型转换为函数类型
        结构和联合类型:两个类型必须相同
    如果返回0,代表程序正常退出
    void类型(无返回值)的函数可以没有return语句
        如果没有,函数执行到结束时的右花括号返回到函数调用处,叫做离开结束

1-3函数的声明

    函数定义起函数声明的作用
    函数定义出现在函数引用之后,则必须在之前给出函数原型,告诉编译器函数的相关参数
    函数原型中函数名可以省略,eg:
                                void GuessNum(int);《=》void GuessNum(int x);
    函数原型凡在任何函数定义之外,则函数原型之后该文件中所有函数都可以调用他;
        而放在某个函数定义中的函数原型只能在该函数中调用它。

1-4新增关键字

    1)inline
> inline int add(int a,int b)           {
>               return (a+b);
>            }
        inline建议编译器将内联函数(inline)的函数体替换函数中出现的相关调用表达式
        用增加代码量的代价换取时间上的节省
    2)_Noreturn
            告诉编译器此函数不返回到调用处,_Noreturn函数之后的代码不可到达

2、函数调用与参数传递

函数的调用三种出现形式:

        1)作为表达式语句:putchar(c);
        2)作为表达式中的一个操作数:c=getchar();
        3)作为函数调用的实参作为嵌套调用:while( putchar( getchar() ) != '#');
    实参的求值顺序:
        由具体实现决定从左到右还是从右往左,所以尽量避免使用引起副作用的实参表达式
        eg:
            power(a,a++);

3、作用域与可见性

作用域是指标识符(变量或函数 )的有效范围,代码中的变量分为全局变量和局部变量

    局部变量在函数内部定义的变量,作用域仅限于定义该变量的!程序块!
    全局变量在函数外部定义的变量,作用域为整个源程序

        在函数中使用全局变量,一般要对该变量进行引用性说明,说明它的类型
        说明符为:extern//其作用域通过extern声明语句可以扩展到应用点之前及其他文件
        其实只要在外部变量定义之后的函数内引用并不需要说明,也就是说,好的编程习惯是把所有的外部变量的定义放在源文件的开始处

作用域规则:

    1)文件范围。文件开头到结尾,全局变量和函数。
    2)块范围。{ 与 } 之间,复合语句内定义变量。
    3)函数原型范围。原型的( 与 )之间,函数原型说明的变量。
    4)函数范围。函数体 { 与 } 之间,goto语句的标号。

可见性:

    外层块的的变量名在内层块中是有效的
    而当变量同名,那么内层的变量起作用,外层的变量名暂时失去作用
    全局变量和局部变量也可以同名,在局部变量的作用域内,全局变量不可见   

4、存储类型

程序占用的内存分为以下几个部分:

    1)程序代码区:存放程序的二进制代码
    2)静态数据区:存放程序运行期间用到的数据。
        存储空间编译时分配,一直存在到程序结束由系统释放
    3)动态数据区(栈区):也存放程序运行期间用到的数据。
        存储空间由编译器自动分配释放。
    4)堆区:由程序员分配释放,程序员不释放,程序结束后系统可能释放

存储类型

    1)auto:
        局部变量的默认存储类型为auto自动变量,作用域从定义它之后到块结束
        每次进入都要重新分配释放,生命周期短暂
    2)extern:
        外部变量与外部函数得存储类型为extern
        外部变量定义时没有初始化,其默认初值为0
        extern即告诉编译器:“在本文件或其他文件中寻找该外部变量”
        在定义变量或函数点之前或其他文件中调用要先用extern声明
    3)static:
        静态局部变量:
            作用域于定义它的块,static变量表示在程序执行期间不会消失
            它的值具有连续性,当退出块时,它的值可以保留下来
        静态外部变量:
            只能作用于定义它的文件,其他文件中的函数不能使用,不能用extern
        静态函数:
            把函数的作用限制在定义它的文件中,保证文件的独立性
    4)register:
        只能定义局部变量,寄存器变量
        register只是建议编译器把该变量存储在计算机的高速硬件寄存器中
        如果不能分配,当做自动变量处理,在栈上分配存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值