【C语言初阶(8)】函数1

news2024/9/28 10:46:29

文章目录

  • 1. 函数的介绍
  • 2. 函数的分类
    • 2.1 库函数
    • 2.2 自定义函数
  • 3. 函数的参数
  • 4. 函数的调用
    • 4.1 传值调用
    • 4.2 传址调用

1. 函数的介绍

1. 什么是函数?

  • 函数是完成特定任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。
    1. 一些函数执行某些动作,如 printf ( ) 把数据打印到屏幕上;
    2. 一些函数找出一个值供程序使用,如 strlen( ) 把指定字符串的长度返回给程序。
  • 一般而言,函数可以同时具备以上两种功能。

2. 为什么要使用函数?

  • 使用函数可以省去编写重复代码的苦差。如果程序要求多次完成某项任务,那么只需要编写一个合适的函数,就可以在需要时使用这个函数,或者在不同的程序中使用该函数,就像许多程序中使用 putchar( ) 一样。
  • 提高程序代码的可读性,即使程序只完成某项任务一次,也值得使用函数。因为函数让程序更加模块化,从而提高程序代码的可读性,更方便后期修改、完善。
  • 有了这些函数,我们就不用去关注内部的实现细节,只需要将注意力放在程序的实现逻辑上即可。

2. 函数的分类

2.1 库函数

1. 什么是库函数?

  • C 语言内置的函数称之为库函数。
  • 如:printf、strlen、time、rand …等。

2. C 语言常用库函数

  • IO函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间/日期函数
  • 数学函数
  • 其他库函数

3. 如何学习库函数?

  • C 语言中的库函数有很多种,倒也不必全部记住,只要掌握查询库函数的技能就行了。
  • 个人在使用的查询库函数的网址:https://cplusplus.com。
    • 因为本人英语基础比较差,所以才逼着自己看这种全英文的网站,中文网站在后面会分享。
  • 注:使用库函数,必须包含 #include 对应的头文件。

在这里插入图片描述

4. 库函数查询工具

  • MSDN(Microsoft Developer Network)
  • http://www.cplusplus.com
  • https://en.cppreference.com(英文版)
  • https://zh.cppreference.com(中文版)

2.2 自定义函数

1. 函数的组成

ret_type fun_name(para1, * )
{
 statement;//函数体
}
  • ret_type:返回类型,返回类型有 Int、float、double、void 等,具体看函数内的返回类型决定该用什么。
  • fun_name:函数名,函数名随意,但是取得名字要有意义。
  • para1:函数参数,参数可以有零个或多个。

2. 什么是自定义函数?

  • 作为一门高级编程语言,C 语言还允许我们自己进行函数的封装。
  • 当我们将代码段根据其功能封装成为一个个不同的函数时,其实就是模块化程序设计,也就是把大的计算任务拆分成若干个较小的任务来实现。
    • 下面通过一个例子来讲解一下函数的封装。下面代码封装一个 print_C 函数,调用它就可以打印一个由井字符(#) 构成的字母 C。
#include <stdio.h>

void print_C(void); //函数声明
void print_C(void) //函数定义开始
{
	printf(" ###### \n");
	printf("##    ##\n");
	printf("##      \n");
	printf("##      \n");
	printf("##      \n");
	printf("##    ##\n");
	printf(" ###### \n");
}//函数定义结束

int main()
{
	print_C();//调用 print_C 函数
	return 0;
}

在这里插入图片描述

3. 为什么要自定义函数?

因为随着程序规模的变大,都免不了会遇到下面这些问题:

  • main 函数变得相当冗杂,程序可读性差。
  • 程序复杂度不断提高,编程变成了头脑风暴。
  • 代码前后关联度高,修改代码往往牵一发而动全身。
  • 变量的命名成了问题,一个项目中那么多的变量,哪来那么多名字给你用。
  • 为了在程序中多次实现某功能,不得不重复多次写相同的代码。
  • ……

3. 函数的参数

  • 函数的参数分为形参和实参。

1. 形式参数(形参)

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

2. 实际参数(实参)

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

3. 函数参数实例

  • 编写一段函数用来求四个数中得最大值。
#include <stdio.h>
//形参 q w e r 是用来接收实参传过来的值
int get_max(int q, int w, int e, int r)
{
	int x = q > w ? q : w;
	int y = e > r ? e : r;
	return x > y ? x : y;//返回四个数中得最大值
}

int main()
{
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);

	int max = get_max(a, b, c, d);
	//a b c d 就是传递给函数的有实际意义的值,所以叫实参
	printf("max = %d\n", max);
}

在这里插入图片描述

4. 函数参数总结

  • 形参和实参的功能说白了就是用作数据传送。
  • 当发生函数调用时,实参的值会传递给形参,并且这种传输具有单向性(也就是不能把形参的值传回给实参)。
  • 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只在函数内部有效,不能在函数外部使用

4. 函数的调用

写一个函数用以交换两个变量的值

4.1 传值调用

#include <stdio.h>
void swap(int x, int y)
{
	int z = x;
	x = y;
	y = z;
}

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);

	printf("交换前:a = %d,b = %d\n", a, b);
	swap(a , b);
	printf("交换后:a = %d,b = %d\n", a, b);

	return 0;
}

在这里插入图片描述

  • 可以看到,和我们预想的结果完全不一样,明明把参数传进去了,可为啥没有任何变化呢?
  • 因为函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
  • 函数内部创建的形参和外部的实参之间一点关系都没有, 这时候就要用到俺们的传址调用了。

4.2 传址调用

  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
    作函数外部的变量。
#include <stdio.h>
//用指针变量 x y来接收传来的地址,让形参和实参之间产生点关系
void swap(int* x, int* y)//交换地址所指向的那个值
{
	int z;
	//在指针中,*指针变量名 等价于 指针指向的那个变量,所以这段代码的实际意义应该是
	 z = *x; //z = a;
	*x = *y; //a = b;
	*y =  z; //b = z;
}

int main()
{
	int a, b;
	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;
}

在这里插入图片描述

函数下半部分传送门:https://editor.csdn.net/md/?not_checkout=1&spm=1001.2014.3001.4503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Guava 之 EventBus

​​EvenBus​​​ 是 Guava 中 Pub/Sub 模式的轻量级实现。平时开发如果我们要实现自己的 Pub/Sub 模型&#xff0c;要写不少类&#xff0c;设计也挺复杂&#xff0c;对业务代码也有一定的侵入&#xff0c;但是在使用了 ​​EventBus​​ 之后就很方便了。 在 Pub/Sub 模式中…

Java——《面试题——tomcat篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

干货 | 智慧教育平台生成式人工智能应用的安全要求

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。 第一部分&#xff1a;编制说明 标准制定的基本原则主要包括以下四个方面&#xff1a; 综合性&#xff1a;本标准全面漫盖了智慧教育平台ChatGPT安全保护的要求&#xff0c;以便用户参考&#xf…

Spring:Bean

Bean 概述配置方式自动装配继承与依赖作用域外部属性文件的使用 概述 Spring 容器负责管理依赖注入&#xff0c;它将被管理的对象都称为 bean 。我们通过 xml 文件配置方式进行对 bean 的声明和管理。 写法如下&#xff1a; <beans><bean id"bean的唯一标识符…

Scrapy框架--CrawlSpider (详解+例子)

目录 CrawlSpider 简介 基本运行 特性和概念 基本使用 创建CrawlSpider 运行 使用CrawlSpider中核心的2个类对象 Rule对象 LinkExtractors 作用 使用 查看效果-shell中验证 示例 注意 CrawlSpider 简介 CrawlSpider 是 Scrapy 框架提供的一个特殊的 Spider 类…

Jvm内存模型剖析优化-JVM(四)

上篇文章代码实例详解如何自定义双亲委派&#xff0c;主要实现ClassLoader&#xff0c;有两个方法&#xff0c;一个直接loadClass用父类的&#xff0c;如果想在破坏&#xff0c;则需要重写loadClass&#xff0c;一个findClass必须要重新&#xff0c;因为父类是空的&#xff0c;…

SpringBoot3之GraalVM之Linux详细安装及使用教程

Linux安装底层工具相关依赖 yum install -y gcc glibc-devel zlib-devel安装GraalVM JDK 《GraalVM官网下载》 找到最近的GraalVM Community Edition X.X.X点击Assets&#xff08;因为我的是SpringBoot3项目&#xff0c;起始JDK就要求17&#xff0c;所以我下载17&#xff09;下…

青少年机器人技术一级核心知识点:机械结构及模型(一)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

vim背景颜色设置

cd ~进入个人家目录下&#xff0c;vim .vimrc进入vimrc文件&#xff1a; 在主题设置部分对颜色背景进行设置&#xff0c;onedark表示黑色背景&#xff0c;default表示白色背景&#xff0c;按需设置即可&#xff01;

网络知识点-链路聚合

链路聚合&#xff08;英语&#xff1a;Link Aggregation&#xff09;是一个计算机网络术语&#xff0c;指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量吞吐量在各成员端口的负荷分担&#xff0c;交换机根据用户配置的端口负荷分担策略决定…

【数据结构】算法的时间和空间复杂度

目录 1.什么是算法&#xff1f; 1.1算法的复杂度 2.算法的时间复杂度 2.1 时间复杂度的概念 计算Func1中count语句总共执行了多少次 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 实例1:执行2N10次 实例2:执行MN次 实例3:执行了100000000次 实例4:计算strchr的时…

java jwt生成token并在网关设置全局过滤器进行token的校验并在给请求头设置参数及在微服务中解析参数

1、首先引入jjwt的依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>2、编写生成token的工具类 package com.jjw.result.util;import com.jjw.res…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象&#xff0c;他通过抽象类所定义的接口&#xff0c;封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例&#xff0c;之前没有的点进去申请 2.点击产品&#xff0c;创建产品 3.产品名称自定义&#xff0c;按项目选择类型&#xff0c;节点类型选择之恋设备&#xff0c;联网方式W…

Linux下安装Redis的详细安装步骤

一.Redis安装 1.下载linux压缩包 【redis-5.0.5.tar.gz】 2.通过FlashFXP把压缩包传送到服务器 3.解压缩 tar -zxvf redis-5.0.5.tar.gz4.进入redis-5.0.5可以看到redis的配置文件redis.conf 5.基本的环境安装 使用gcc -v 命令查看gcc版本已经是4.8.5了&#xff0c;于是就…

ubuntu系统突然失去网络问题

修复ubuntu系统网络问题 1. 服务不存在&#xff1f;2. 修改配置&#xff0c;自动启动网络 每天都在用的ubuntu系统突然ssh连接不上&#xff0c;进系统ifconfig也不显示ip。当然也ping不通任何网页。 1. 服务不存在&#xff1f; 初步怀疑网络服务被关闭了&#xff0c;需要修改配…

【C6】数据类型/移植/对齐,内核中断,通过IO内存访问外设,PCI

文章目录 1.内核基础数据类型/移植性/数据对齐&#xff1a;页大小为PAGE_SIZE&#xff0c;不要假设4K&#xff0c;保证可移植性1.1 kdatasize.c&#xff1a;不同的架构&#xff08;x86_64,arm&#xff09;&#xff0c;基础类型大小可能不同&#xff0c;主要区别在long和指针1.2…

chatgpt赋能python:用Python访问数据库的SEO文章

用Python访问数据库的SEO文章 在当今互联网飞速发展的时代&#xff0c;数据处理和数据库技术的重要性不言而喻。在这些应用中&#xff0c;Python是使用最广泛和最受欢迎的编程语言之一。Python的简单和易学性使其成为理想的选项&#xff0c;可以通过Python来访问各种类型的数据…

荣耀90推出最新MagicOS7.1更新,增加控制中心功能

荣耀 90 系列机型推出了最新的 Magic OS 7.1更新&#xff0c;版本号为7.1.0.137 (C00E130R2P2)。该更新主要增加了控制中心功能&#xff0c;并对部分场景拍摄效果进行了优化。此外&#xff0c;该更新还提升了系统与部分三方应用的兼容性&#xff0c;以提高系统性能和稳定性。 …

选择最适合您自动化系统的控制方式

自动化系统可采用多种不同的控制方式&#xff0c;其中硬件控制和PLC&#xff08;可编程逻辑控制器&#xff09;是常见的选择。 刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 硬件控制通常指使用专用硬件电路实现控…