C语言

3. C语言--函数

Posted on 2022-01-30,6 min read

3.函数

3.1 函数是什么

函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在C语言中,子程序是由一个主函数和若干个函数构成的。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

3.1.1 函数分类

  • 自定义函数
  • 库函数

3.2 库函数

一般是指编译器提供的可在C源程序中调用的函数。分为两类,C语言标准规定的库函数和编译器特定的库函数。

3.2.1 网站

Learn C and C++ Programming - Cprogramming.com

C 标准库头文件 - cppreference.com

https://docs.microsoft.com/en-us/cpp/c-runtime-library/c-run-time-library-reference?view=msvc-170

3.2.2 strcp

3.2.3 memset

3.3 自定义函数

// 格式:
ret_type func_name( parameter list )
{
   body of the function
}
// return_type 函数的返回类型
// function_name 函数名称
// parameter list 参数列表
// body of the function 函数体
// 当函数不返回任何类型,ret_type为关键字void
  • 实例

    void Swap(int* pa, int* pb)
    {
      int z = 0;
      z = *pa;
      *pa = *pb;
      *pb = z;
    }
    
    int main() 
    {
      int a = 10;
      int b = 20;
      printf("交换前 a=%d, b=%d\n", a, b);
      Swap(&a, &b);
      printf("交换后 a=%d, b=%d\n", a, b);
    }
    


  • 重点

    void Swap(int* pa, int* pb)
    {
      int* z = NULL;
      printf("%p %p %p\n", pa, pb, z);
      z = pa;
      pa = pb;
      pb = z;
      printf("%p %p %p\n", pa, pb, z);
    }
    
    // 不能通过交换a、b的地址交换a、b的数据
    
    int main() 
    {
      int a = 10;
      int b = 20;
      printf("交换前 a=%d, b=%d\n", a, b);
      Swap(&a, &b);
      printf("交换后 a=%d, b=%d\n", a, b);
    }
    
    


3.4 函数参数

3.4.1 实际参数(argument)

真实传递给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行调用时,它们都必须有确定的值,以便把这些值传送给形参。

3.4.2 形式参数(parameter)

形式参数是指函数名后括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成后就自动销毁。因此形式参数只在函数中有效。

3.4.3 形参实例化之后其实相当于实参的一份临时拷贝。

3.5 函数调用

3.5.1 传值调用

该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

3.5.2 引用调用

通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

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

3.6.1 嵌套调用

在函数A()中调用函数B()

#include <stdio.h>
int main() {
  printf("Hello World!\n");
  return 0;
}

// 最简单的嵌套调用,在main函数中调用prinf函数


3.6.2 链式访问

把一个函数的返回值作为另一个函数的参数。

#include <stdio.h>
int add(int x, int y)
{
  return x + y;
}

int main() 
{
  printf("输出:%d\n", add(3, 4));
}


// 将add(3, 4)的返回值作为参数,传递给printf函数


3.7 函数的声明和定义

3.7.1 声明

告诉编译器函数名称及如何调用函数。

return_type function_name( parameter list );
// 在函数声明中
// 参数的名称并不重要
// 只有参数的类型是必需的
// 因此可省略声明中形参的名称

3.7.2 定义

return_type function_name( parameter list )
{
   body of the function
}

3.8 函数递归

函数对自身的调用。

  • 递归的必要条件
    • 递归调用的过程
    • 递归终止的条件

3.9 小知识

#include " " 与 <>有什么区别?

 // 若 #include "" 查找成功,则遮蔽 #include <> 所能找到的同名文件
 // 否则再按照 #include <> 的方式查找文件
 
 // #include <> 的查找位置是标准库头文件所在目录
 // #include "" 的查找位置是当前源文件所在目录
 
 // <>先去系统目录中找头文件,如果没有在到当前目录下找
 // ""首先在当前目录下寻找,如果找不到,再到系统目录中寻找

C语言函数默认返回类型

// C语言中函数如果没有定义返回值类型,则默认返回类型是int


下一篇: 2. C语言--分支和循环语句→