学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-1

简介: 1.函数是什么:维基百科中对函数的定义:子程序* 在计算机科学中,子程序(英语:

1.函数是什么:

维基百科中对函数的定义子程序

* 在计算机科学中,子程序(英语:

Subroutine,procedure,function,routine,method,subprogram,callable unit),是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他台吗,具备相对的独立性。


* 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库(库函数)。

2.库函数:

C语言中把常用的功能进行了封装,封装成一个个的函数,提供出来给大家使用。


比如:scanf、printf、strlen、strcmp、rand、srand、time


C语言并不去直接实现库函数,而是提供了C语言的标准和库函数的约定。


像是给scanf函数的功能、名字、参数、返回值进行约定


而这些库函数约定的实现一般是由编译器去实现的。(VS2022、gcc)为什么会有库函数?

       1.我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待地想知道结果,想把这个结果打印到我们地屏幕上看看。这个时候我们会频繁地使用一个功能:将信息按照一定地格式打印到屏幕上printf);

 2.在编程地过程中我们会频繁地做一些字符串的拷贝工作(strcpy);


       3.在编程时我们也计算,总是会计算n的k次方这样的运算(pow);


像上面我们描述的基础功能,它们不是业余性的代码。我们在开发的过程中每个程序员都可能会用到,为了支持可移植性和提高程序的效率,C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

 学习库函数:


查询工具的使用:


MSDN(Microsoft Developer Network)

https://cplusplus.com

cppreference.com(英文版)

cppreference.com(中文版)

以www.cplusplus.com为例:C library - C++ Reference (cplusplus.com)

2098f5ec1c2648dab91d7da49c81e308.png

999184a251d241d29842cad2624521be.png

25fcbf18b4d54a4f91a14efecfffe615.png

22c4717a24874dd0ad44e5da21bf1fec.png

#include <stdio.h>
#include <string.h>
// strcpy函数的使用
int main()
{
  char arr1[] = "hello friend"; // 源头
  char arr2[20] = { 0 }; // 目的地
  //对于数组:数组名其实是数组第一个元素的地址,也就是起始地址
  strcpy(arr2, arr1);
  printf("%s\n", arr2);
  return 0;
}

image.png

(数组里的结束标志:\0也会被复制)

注:

  1. 库函数必须知道的一个秘密就是:使用库函数,必须包含#include对应的头文件
  2. 这里对照文档来学习几个库函数,目的是掌握库函数的使用方法

C语言常用的库函数有:


*IO函数(输入输出函数)     (scanf、printf、getchar、putcahr...)      


*字符串操作函数   (strlen、strcmp...)


*字符操作函数      (islower、isupper...)


*内存操作函数      (memset、memcmp...)


*时间/日期函数     (time...)


*数学函数     (sqrt、pow...)


*其他库函数          

3.自定义函数:

自定义函数和库函数一样,有函数名返回值类型函数参数

但是不一样的是这些都是我们自己来设计。给程序员很大的发挥空间

自定义函数的组成:


ret_type fun_name(para1, * )


{                                                


statement; // 语句项


}                                                

ret_type:返回类型

fun_name:函数名

para1:函数参数

例子:

1.写一个函数可以找出两个整数中的较大值(没有对实参进行修改):

// 写一个函数可以找出两个整数中的较大值:
#include <stdio.h>
// 自定义函数:
int get_max(int x, int y)
{
  int z = (x > y ? x : y);
  return z;
}
int main()
{
  int a = 0;
  int b = 0;
  //输入
  scanf("%d %d", &a, &b);
  //调用自定义函数
  int m = get_max(a,b);
  //输出
  printf("较大值是: %d", m);
  return 0;
}

image.png

2.写一个函数可以交换两个整型变量的内容(对实参进行了修改):

形参实参地址不同:)

//写一个函数可以交换两个整型变量的内容:
#include <stdio.h>
void Swap(int x, int y) // 这里的 x 和 y 是形参(形式参数)
//当实参传递给实参时,形参是实参的一份临时拷贝,所以对形参的修改不会影响实参
{
  int tmp = x;
  x = y;
  y = tmp;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  printf("交换前:a=%d,b=%d\n", a, b);
  Swap(a, b); // 使用自定义函数调换两个整型变量的内容
  // 这里的 a 和 b 是实参(实际参数)
  printf("交换后:a=%d,b=%d\n", a, b);
  return 0;
}


image.png

(使用指针变量,实现数据对调:)

//写一个函数可以交换两个整型变量的内容:
#include <stdio.h>
void Swap(int *pa, int *pb) // 把 a 和 b 的地址传进来,使用地址变量
// int * 是类型 ,pa是变量名
{
  int tmp = *pa; 
  *pa = *pb;
  *pb = tmp;
  // 变量 pa 或 pb 存放的是 地址
  // *pa 或 *pb 则是通过地址获取里面的内容
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  printf("交换前:a=%d,b=%d\n", a, b);
  Swap(&a, &b); // 取 a 和 b 的地址
  printf("交换后:a=%d,b=%d\n", a, b);
  return 0;
}

image.png

重点

交换的是地址所指向的内容

变量 papb 存放的是 地址

*pa*pb 则是通过地址获取里面的内容


4.函数的参数:

1.实际参数(实参):

真实传给函数的参数,叫实参。

实参可以是:常量变量表达式函数等。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形式参数。

01a51a4c2699471da9d50468eb53e9d5.png

2.形式参数(形参):

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

29f0e5d2b9264aa1bc2cf51ab810a302.png

5.函数调用:

2.形式参数(形参):

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

相关文章
|
7月前
|
存储 C语言
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))
126 0
|
7月前
|
存储 安全 C语言
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
140 0
|
3月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
246 88
|
3月前
|
存储 前端开发 JavaScript
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
本文介绍了JavaScript中作用域的概念,包括全局变量和局部变量的区别,预解析机制(变量提升),以及函数返回值的使用和类型。通过具体示例讲解了变量的作用域、函数的返回值、以及如何通过return关键字从函数中返回数据。
25 1
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
|
程序员
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-2
5.5:练习(部分上一期做过,换成函数做法): (1).写一个函数可以判断一个数是不是素数:
|
C语言
【c语言进阶】还在自己写排序的函数吗?快来通过回调函数学习并模拟库函数 qsort 的实现把
【c语言进阶】还在自己写排序的函数吗?快来通过回调函数学习并模拟库函数 qsort 的实现把
58 0
|
算法 程序员 C语言
【C初阶】第四篇——函数(库函数+自定义函数+函数递归)
【C初阶】第四篇——函数(库函数+自定义函数+函数递归)
【C初阶】第四篇——函数(库函数+自定义函数+函数递归)
|
算法 程序员 编译器
『C语言从入门到进阶』第 ③ 期 - 函数
『C语言从入门到进阶』第 ③ 期 - 函数
91 0
|
搜索推荐 算法 编译器
Python编程基础:实验5——函数定义与调用
有关Python函数定义与调用的一些题目练习。
395 0
Python编程基础:实验5——函数定义与调用
|
存储 前端开发 JavaScript
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)
270 0
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)