C语言中的函数(函数的调用、函数的嵌套调用和链式访问、函数的声明和定义)

发布于:2022-12-14 ⋅ 阅读:(336) ⋅ 点赞:(0)

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

目录

一.函数的调用

1.传值调用

2.传址调用

举例解释这两种调用:

二.函数的嵌套调用和链式访问

1.嵌套调用

2.链式访问

 三.函数的声明和定义

函数声明

函数定义


一.函数的调用

1.传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

2.传址调用

  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操作函数外部的变量。
     

举例解释这两种调用:
 

#include<stdio.h>
int swap1(int x,int y)
{
    int k=x;
    x=y;
    y=k;
}
int swap2(int* x,int* y)
{
    int k=*x;
    *x=*y;
    *y=k;
}
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    swap1(a,b);
    printf("用swap1函数输出结果是:%d %d\n",a,b);
    swap2(&a,&b);
    printf("用swap2函数输出结果是:%d %d",a,b);
}

这里是定义一个函数去将输入的两个数字互换位置,定义了两个函数:swap1和swap2;在swap1中简单的在定义一个变量k去存形式参数x,然后再依次互换以试图将x,y两个值互换来达到a,b两个值互换;而swap2的思路跟swap1有些许不同,第一个不同:传递的实参是一个地址而非变量;第二个不同:函数中是指针变量用来接受主函数传过来的地址。我们运行看看这两个方法有什么不同:

我们可以看到真正达到我们需要的效果的只有swap2。
这就是传值调用(swap1)和传址调用(swap2)的区别:传值调用对形参的修改不会影响实参;而传址调用可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操作函数外部的变量。

二.函数的嵌套调用和链式访问

1.嵌套调用

函数和函数之间可以有机的结合
比如:
 

#include<stdio.h>

void one_line()
{
    printf("hehe\n");//该函数功能就是输出hehe并换行
}
void three_line()
{
    for (int i=0;i<3;i++)//循环3次
    {
        one_line();//调用one_line函数(调用3次)
    }
}
int main()
{
    three_line();//调用three_line函数
    return 0;
}

运行结果是:

 上述代码中在主函数里调用了three_line函数,然后再three_line函数里再调用了one_line函数,这就是一个简单的函数的嵌套调用

2.链式访问

把一个函数的返回值作为另一个函数的参数。
我们用printf做一个简单的例子:

#include<stdio.h>
int main()
{
    printf("%d\n",43);
    printf("%d\n",printf("%d",43));
    printf("%d",printf("%d",printf("%d",43)));
}

我们运行看看结果:

这个结果似乎就很奇怪,我们来分析分析,首先我们可以知道这就是一个函数的多次调用,把一个函数的返回值作为另一个函数的参数。那我们需要知道printf函数会返回一个什么,下面是查询结果:

 它是每次都输出返回值字符的个数,第一次输出43因为此时还不是printf里面的返回值,第二次是将43作为返回值那么就会输出2,第三次将2作为返回值那么就会输出1,所以最后结果就是输出4321。

 三.函数的声明和定义

函数声明

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。
  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  3. 函数的声明一般要放在头文件中的。

函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。

比如:

如果函数定义在后面,那么当我们用函数时就需要在前面进行声明,当然在这个例子中这个功能看似很鸡肋,因为只要把函数定义在main函数之前就可以了,在实际操作中往往不是这么声明的,这个例子只是粗略的让大家理解一下它的作用,实际中一般是这样:
     

 


网站公告

今日签到

点亮在社区的每一天
去签到