『C语言初阶』第三章-函数(2)

        

1.数组做函数参数

        当数组传参时,需要注意

  • 函数的形参要和函数的实参个数匹配
  • 函数的实参是数组,形参也是可以写成数组形式的
  • 形参如果是一维数组,数组大小可以忽略不写
  • 形参如果是二维数组,行可以省略,但是列不能省略,即采用一维数组访问方式访问二维数组
  • 数组传参,形参是不会创建新的数组的
  • 形参操作的数组和实参的数组是同一个数组

2.链式访问

        所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问。

#include<stdio.h>

int main()
{
    printf("%d\n",strlen("123456")); //链式访问
    return 0;
}

       在了解过链式访问之后,看一下下面的代码执行结果为什么?

#include <stdio.h>

int main()
{
    printf("%d",printf("%d",printf("%d",43)));
    return 0;
}

        <提示>  printf()函数返回的是打印在屏幕上的字符的个数。

        所以屏幕上最终打印:4321

5.函数的声明和定义

        5.1单文件

        一般我们在使用函数时,都是直接将函数写出来使用就使用了。

        比如我们要写一个函数计算两数相加和

#include <stdio.h>
//函数的定义
int ADD(int a,int b)
{
    return a+b;
}
int main()
{
    int a=0,b=0;
    scanf("%d %d",&a,&b);
    int sum=ADD(a,b); //函数的使用
    printf("%d",sum);
    return 0;
}

           函数的性质为先定义在使用,所以将函数的定义放在函数使用之后就会报错。

            但如果在函数使用前加上一个申明交代清楚:函数名,函数返回类型和函数的参数。       

#include <stdio.h>
//函数的声明
int ADD(int a,int b);

int main()
{
    int a=0,b=0;
    scanf("%d %d",&a,&b);
    int sum=ADD(a,b); //函数的使用
    printf("%d",sum);
    return 0;
}
//函数的定义
int ADD(int a,int b)
{
    return a+b;
}

        这样代码就可以正常执行了。

        5.2多文件

        一般在企业中我们写代码时候,代码会比较多,不会将所有代码都放在一个文件中;我们往往会根据程序的功能,将代码拆分放在多个文件中。

        一般情况下,函数的声明、类型的声明放在头文件(.h)中,函数的实现是放在源文件(.c)文件中。

        将一个复杂的代码按照功能分成不同的模块去实现,好处是:

  • 逻辑清晰
  • 方便写作
  • 方便代码的隐藏

        1. 静态库(.lib)

          在企业当中,时常会出现买卖代码实现模板的情况,而买卖代码时为了代码的隐秘性,卖家就会将源代码编译为静态库(.lib)进行售卖,同时为了保证买家可以看懂函数是怎么使用的,也会将源代码所伴随的头文件也发给买家。

        注:静态库正常开始为乱码

        将工程文件制作成静态库过程如下

        设置完成后,ctrl+F5运行一下,在工程文件下就可找到了

     5.3static和extern

        staticextern 都是C语言中的关键字

        static 是静态的意思,用于

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

        extern 是用来修饰外部符号的

        作用域: 程序设计概念,通常来说,一段程序代码中所用到的名字并不是总是有效(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围
  2. 全局变量的作用域是整个工程(项目)。

        生命周期指的是变量的创建(申请内存)到变量销毁(收回内存)之间的一个时间段

  1. 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期是:整个程序的生命周期。

        5.3.1 static修饰局部变量

        static修饰局部变量会改变变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才收回。但是作用域是不变的。

        使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static修饰。

        5.3.2 static 修饰全局变量

        

       extern 是用来声明外部符号的,如果一个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern <类型> 进行声明,然后使用。

        代码前一个正常,后一个代码在编译的时候会出现链接性错误。

        结论:

       一个全局变量被static修饰,使得或者全局变量只能在本源文件内使用,不能在其他源文件内使用。

        本质原因为 全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的外部声明就可以使用,但是全局变量被static 修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的。

        使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。

        5.3.3 static 修饰函数

                static 修饰函数和全局变量是一样的,参考上面static修饰全局变量。        

        

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值