【c语言 】 函数入门

news2024/11/19 21:22:19

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【c语言 】 函数入门

  • 一 引入
  • 二 函数的概念
  • 三 函数语句结构
  • 四 函数执行过程
    • 流程图:
    • 4.1 函数调用:
    • 4.2 参数传递:
    • 4.3 栈帧创建:
    • 4.4 函数体执行:
    • 4.5 返回值处理:
    • 4.6 栈帧销毁与返回:
    • 4.7 返回值使用:
  • 五 类比
  • 总结

引言:

在编程的世界中,函数是构成程序的基本单元,它们像乐高积木一样,通过不同的组合方式构建出各种功能强大的程序。

对于初学者来说,掌握函数的概念和使用方法,是迈向编程高手之路的重要一步。

在C语言中,函数扮演着至关重要的角色,它们不仅能够帮助我们组织代码,提高代码的可读性和可维护性,还能实现代码的复用,提高开发效率。

本篇博客将带领大家走进C语言函数的世界,从概念到使用,一步步解析函数的奥秘。

在这里插入图片描述

一 引入

今天呢,老师给了豌豆一个作业,这个作业花了我很长的时间,写了足足一百多行的代码才完成,我兴高采烈地向老师交了作业,心想,花了这么长的时间写的代码,一定受到老师的夸奖吧,嘿嘿,但是没想到啊!老师一看完我的代码,就把我痛骂一顿!直接让我懵逼了!呜~

直到看完老师给我的代码,我才反应过来,原来这个作业还可以这样写啊!

接下来就让我来具体讲讲这个作业到底是什么吧~

作业呢,给我提供了五个数组,

数组如下:

#include <stdio.h>  
  
// 定义一个包含5个正整数的数组  
int positiveNumbers[] = {1, 2, 3, 4, 5};  
  
// 定义一个包含5个负整数的数组  
int negativeNumbers[] = {-1, -2, -3, -4, -5};  
  
// 定义一个包含10个零的数组  
int zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  
  
// 定义一个包含随机整数的数组  
int randomNumbers[] = {7, -9, 12, 0, 5, -3, 8, 2, -1, 4};  
  
// 定义一个按照升序排列的数组  
int sortedNumbers[] = {1, 3, 5, 7, 9};  

要求呢,是写一个代码,分别计算这个五个数组中所有元素的和,

我心想,这不是简简单单的嘛!我们直接在main函数中遍历数组并累加元素 不就可以了!

于是我开始敲代码了,费劲心思,也是将代码成功敲出,成品如下:

#include <stdio.h>  
  
int main() {  
    // 定义并初始化五个数组  
    int positiveNumbers[] = {1, 2, 3, 4, 5};  
    int negativeNumbers[] = {-1, -2, -3, -4, -5};  
    int zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  
    int randomNumbers[] = {7, -9, 12, 0, 5, -3, 8, 2, -1, 4};  
    int sortedNumbers[] = {1, 3, 5, 7, 9};  
  
    // 计算并打印正整数数组的和  
    int positiveSum = 0;  
    for (int i = 0; i < sizeof(positiveNumbers) / sizeof(positiveNumbers[0]); i++) {  
        positiveSum += positiveNumbers[i];  
    }  
    printf("Sum of positiveNumbers: %d\n", positiveSum);  
  
    // 计算并打印负整数数组的和  
    int negativeSum = 0;  
    for (int i = 0; i < sizeof(negativeNumbers) / sizeof(negativeNumbers[0]); i++) {  
        negativeSum += negativeNumbers[i];  
    }  
    printf("Sum of negativeNumbers: %d\n", negativeSum);  
  
    // 计算并打印零数组的和  
    int zeroSum = 0;  
    for (int i = 0; i < sizeof(zeros) / sizeof(zeros[0]); i++) {  
        zeroSum += zeros[i];  
    }  
    printf("Sum of zeros: %d\n", zeroSum);  
  
    // 计算并打印随机整数数组的和  
    int randomSum = 0;  
    for (int i = 0; i < sizeof(randomNumbers) / sizeof(randomNumbers[0]); i++) {  
        randomSum += randomNumbers[i];  
    }  
    printf("Sum of randomNumbers: %d\n", randomSum);  
  
    // 计算并打印升序排列数组的和  
    int sortedSum = 0;  
    for (int i = 0; i < sizeof(sortedNumbers) / sizeof(sortedNumbers[0]); i++) {  
        sortedSum += sortedNumbers[i];  
    }  
    printf("Sum of sortedNumbers: %d\n", sortedSum);  
  
    return 0;  
}

唔~ 代码有点长,唉!谁叫他要让我一下计算五个数组的和呢,那我只能使用五个for循环去计算了,木得办法嘛~ 但好歹也是完成了,哈哈。

但没想到,当我把代码给老师看的时候,他居然直接瞪了我一眼,看我就像看傻子一样,说:

“写这么长的代码…你是不会用函数吗?”

“啊,函数?什么是函数?” 我心中充满了疑惑。

于是他把他的代码给我看了。

#include <stdio.h>  
  
// 自定义函数来计算数组的和  
int sumArray(int arr[], int size) {  
    int sum = 0;  
    for (int i = 0; i < size; i++) {  
        sum += arr[i];  
    }  
    return sum;  
}  
  
int main() {  
    // 定义并初始化五个数组  
    int positiveNumbers[] = {1, 2, 3, 4, 5};  
    int negativeNumbers[] = {-1, -2, -3, -4, -5};  
    int zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  
    int randomNumbers[] = {7, -9, 12, 0, 5, -3, 8, 2, -1, 4};  
    int sortedNumbers[] = {1, 3, 5, 7, 9};  
  
    // 调用sumArray函数计算并打印正整数数组的和  
    int positiveSum = sumArray(positiveNumbers, sizeof(positiveNumbers) / sizeof(positiveNumbers[0]));  
    printf("Sum of positiveNumbers: %d\n", positiveSum);  
  
    // 调用sumArray函数计算并打印负整数数组的和  
    int negativeSum = sumArray(negativeNumbers, sizeof(negativeNumbers) / sizeof(negativeNumbers[0]));  
    printf("Sum of negativeNumbers: %d\n", negativeSum);  
  
    // 调用sumArray函数计算并打印零数组的和  
    int zeroSum = sumArray(zeros, sizeof(zeros) / sizeof(zeros[0]));  
    printf("Sum of zeros: %d\n", zeroSum);  
  
    // 调用sumArray函数计算并打印随机整数数组的和  
    int randomSum = sumArray(randomNumbers, sizeof(randomNumbers) / sizeof(randomNumbers[0]));  
    printf("Sum of randomNumbers: %d\n", randomSum);  
  
    // 调用sumArray函数计算并打印升序排列数组的和  
    int sortedSum = sumArray(sortedNumbers, sizeof(sortedNumbers) / sizeof(sortedNumbers[0]));  
    printf("Sum of sortedNumbers: %d\n", sortedSum);  
  
    return 0;  
}

看完之后,我目瞪口呆,原来,代码还能这么玩?

他将for循环放入了“一条语句”里,也就是函数里,然后我们就不用重复执行多次for循环了,我们直接把数组和数组大小传入这条语句,这条语句就会自动帮我们计算数组的和。

这真是太牛啦!那这样我们以后要重复执行一段代码的时候,我们直接把其封装成函数就可以了,用一条语句就能执行一个复杂的操作。

于是我连忙向他请教了函数的相关概念,也是终于弄懂了函数,当然我也是一个爱分享的人,就把他教的知识分享给你们吧!

欲知函数,请看下文。

二 函数的概念

在C语言中,函数是一个独立的代码块,用于执行特定的任务或操作。

代码块(code block)是指由一对花括号 {} 包围起来的一段代码。

它相当于一个黑盒子,可以接受输入(参数),并自动执行一系列操作,并可能返回一个输出值(返回值)。

这些操作是事先定义好的,并不需要我们去定义,我们提供输入就可以

函数是C语言模块化编程的核心概念,通过将代码分解为多个函数,可以提高代码的可读性、可维护性和重用性。

通过使用函数,我们可以将复杂的程序分解为更小、更易于管理的部分,提高代码的可读性和可维护性。

此外,函数还可以促进代码的重用,减少重复编写代码的工作量。

三 函数语句结构

语法结构如下:

返回类型 函数名(参数列表) {  
    // 函数体开始  
    // ...  
    // 这里可以包含局部变量定义、控制语句等  
    // ...  
  
    // 返回语句,对于返回类型为void的函数则不需要  
    return 表达式;   
    // 函数体结束  
}

这里的各个部分解释如下:

返回类型:
指定函数返回值的类型。如果函数不返回任何值,则使用void作为返回类型。

函数名:
函数的唯一标识符,用于在程序中调用该函数。

参数列表:
由逗号分隔的参数列表,用于向函数传递值。每个参数由类型说明符和变量名组成。如果函数不接受任何参数,则参数列表可以为空,但括号()是必须的。

函数体:
包含函数实际执行的语句的代码块,用大括号{}包围。 return

表达式;:
返回语句,它用于从函数中返回一个值。表达式是返回值的表达式。如果函数返回类型为void,则不需要return语句或返回表达式。

示例:

以下是一个简单的函数语法示例的中文表示,该函数计算两个整数的和并
返回结果:

int 加法(int a, int b) {  
    int= a + b; // 计算两个数的和  
    return;      // 返回结果  
}

在这个例子中,int是返回类型,加法是函数名, (int a, intb)是参数列表,其中包含两个整数参数a和b。函数体中包含一个局部变量和,用于存储两个参数的和,最后通过return 和;语句返回这个值。

调用函数:

int main() {  
    int 结果 = 加法(3, 4); // 调用加法函数,并传递参数3和4  
    printf("和是:%d\n", 结果); // 输出结果  
    return 0;  
}

在这个main函数中,我们调用了加法函数,并传递了参数3和4。函数的返回值被存储在结果变量中,并随后被打印出来。

四 函数执行过程

流程图:

在这里插入图片描述

步骤介绍如下:

4.1 函数调用:

当程序中某个地方需要执行一个函数时,会发生函数调用。这通常是通过函数名后面跟着一对圆括号以及可能的参数列表来实现的.

调用函数时,程序的控制权会转移到被调用的函数。

例:

int 结果 = 加法(3, 4); // 调用加法函数,并传递参数3和4

4.2 参数传递:

如果函数定义时声明了参数,那么在调用函数时,需要传递相应的实参(实际参数)给形参(形式参数)。这些实参可以是常量、变量、表达式或者其他函数的返回值。在函数调用时,实参的值会被复制到形参中。

4.3 栈帧创建:

函数调用时,会创建一个新的栈帧(stack frame)来存储函数局部变量和返回地址等信息。

栈帧是程序运行时在内存栈上分配的一块区域,用于保存函数调用的上下文信息。

4.4 函数体执行:

控制权转移到函数后,程序开始执行函数体中的代码。这包括执行任何局部变量声明和初始化,以及函数体内的语句和表达式。

函数体中的代码会按照顺序逐条执行,可能会包含控制流语句(如if语句、循环语句等)来改变执行顺序。

4.5 返回值处理:

如果函数有返回值,那么在函数体中的某个位置(通常在函数的末尾),会有一个return语句。return语句后面的表达式会被计算,其值作为函数的返回值。

这个返回值会被复制到调用函数时预留的存储空间中,以便调用函数能够使用。

4.6 栈帧销毁与返回:

当函数执行完毕(无论是正常执行完毕还是因为某种原因提前退出,如遇到return语句或发生异常),当前栈帧会被销毁,所有局部变量和相关信息都会被清除。

然后程序的控制权会返回到调用函数处,继续执行调用函数后面的代码。

4.7 返回值使用:

在调用函数中,可以使用被调用函数返回的值。

这通常是通过将函数的返回值赋给一个变量,或者直接在表达式中使用函数的返回值来实现的。

这就是C语言中一个函数的基本执行过程。需要注意的是,这个过程涉及到函数调用约定、内存管理、参数传递机制等底层细节,这些细节可能会因不同的编译器和平台而有所差异。

在实际编程中,我们通常不需要关心这些底层细节,只需要按照C语言的语法和语义来编写和调用函数即可。

五 类比

一个自助餐厅中的制作汉堡的流程可以类比为C语言中的函数概念。

在这个例子中,我们可以将自助餐厅的汉堡制作机比作一个函数,顾客点单和取餐的过程类比为函数调用。
在这里插入图片描述

下面是具体的类比:

1 return_type(返回类型):

在自助餐厅中,这可以类比为顾客取到的汉堡类型。 比如,顾客可以选择牛肉汉堡、鸡肉汉堡等。

这就好比函数的返回类型,它指定了函数将返回什么样的值给调用者。

2 function_name(函数名):

在这个例子中,函数名可以类比为“制作汉堡”。 当顾客想要一个汉堡时,他们会找到汉堡制作机并告诉它要制作哪种汉堡。

这就好比在程序中调用一个函数,通过函数名来指定要执行的操作。

3 parameter list(参数列表):

顾客在点单时,可能会指定汉堡的配料,比如要加生菜、番茄、芝士等。这些配料就好比函数的参数,它们提供了函数执行时所需的具体信息。

在C语言中,参数列表是由逗号分隔的一系列参数,每个参数都包含类型说明符和变量名。

4 function body(函数体):

汉堡制作机接收到顾客的订单和配料要求后,开始制作汉堡。这个过程包括准备面包、添加肉类、蔬菜和酱料等步骤。

这就好比函数体中的代码块,它包含了函数实际执行的语句和逻辑。

5 return expression(返回语句):

当汉堡制作完成后,制作机会将制作好的汉堡送出供顾客取用。

这个过程可以类比为函数的返回语句。在C语言中,返回语句用于从函数中返回一个值给调用者。

在这个例子中,返回的“值”就是制作好的汉堡。

总结:

顾客想要一个汉堡(调用函数),告诉汉堡制作机他们想要的配料(传递参数),汉堡制作机开始制作(执行函数体),最后顾客取到制作好的汉堡(接收返回值)

。这个过程与在C语言中调用一个函数非常相似,通过函数名、参数列表和函数体来实现特定的功能,并可能返回一个结果。

总结

通过本篇博客的学习,我们深入了解了C语言中函数的概念、语句结构以及执行过程。

函数作为C语言编程的基础构件,其重要性不言而喻。通过掌握函数的定义、调用和参数传递等关键知识,我们能够编写出更加高效、可维护的代码。

同时,通过类比现实生活中的例子,我们更加直观地理解了函数的工作原理。

希望本篇博客能够帮助大家更好地掌握C语言函数的使用技巧,为后续的编程学习打下坚实的基础。

在未来的编程道路上,愿我们都能像搭积木一样,灵活运用各种函数,构建出属于自己的精彩世界。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

笔记 mysql text 不能设置他的默认值如not null

mysql text 不能设置他的默认值 那么插入时默认值是多少&#xff1f; 在 MySQL 中&#xff0c;TEXT 类型的字段不能直接指定默认值 因此&#xff0c;如果你尝试在创建表时为 TEXT类型的字段指定默认值&#xff0c;MySQL 会抛出错误。 然而&#xff0c;虽然不能在表定义中为 TE…

2024年腾讯云优惠券_云服务器代金券_优惠折扣整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

【零基础学习01】嵌入式linux驱动中pinctrl和gpio子系统实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面pinctrl和gpio子系统控制实验,操作硬件为I.MX6ULL开发板。 第一:pinctrl和gpio子系统简介 Linux系统是一个庞大又完善的系统,如果采用…

matlab 基操~

MATLAB基本操作 1. 对象定义 使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \lim_{v \rightarrow a} f(x) $$ limit(f,v,a) % 使用limit(f,v,a,left)可求左极限 3. 导数 使用diff(f,v,n)对$ f(v)v^{t-1} $求 $ n $ 阶导 $ \frac{d^nf}{d^nv} $&#xf…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…

一文了解原型和原型链

本文重点概念&#xff1a; 1、所有的对象都是new一个函数创建的 2、所有的函数都有一个属性prototype&#xff0c;称为函数原型 3、函数原型得到的这个对象都有一个属性constructor,指向该函数 4、所有的对象都有一个属性&#xff1a;隐式原型__proto__&#xff0c;隐式原型…

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

Python中的运算符介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

四节点/八节点四边形单元悬臂梁Matlab有限元编程 | 平面单元 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

关于比特币的AI对话

【ChatGPT】 比特币源码开源吗&#xff1f; 是的&#xff0c;比特币的源码是开源的。比特币项目是在MIT许可证下发布的&#xff0c;这意味着任何人都可以查看、修改、贡献和分发代码。比特币的源码托管在GitHub上&#xff0c;可以通过下面的链接进行访问&#xff1a; https://g…

一个超冷门的 Vue3 内置组件,帮我优化了66%的性能!

背景 最近项目中有一个页面&#xff0c;是之前的老页面&#xff0c;页面中的内容其实就是一个 Tabs 组件&#xff0c;有三个 Tab&#xff0c;分别展示不同的内容&#xff0c;但是也有共同内容&#xff0c;那就是共同都有一个一个报表组件 下面是大致的代码展示如下&#xff0c…

pyqt线程正确使用

PyQt之科学使用线程处理耗时任务以及线程通信方法 上面这篇文章看似很科学… 经过实际测试&#xff0c;需要按下面创建线程&#xff1a; self.work EmailWork() self.thread QtCore.QThread() self.thread.start()self.work.moveToThread(self.thread) self.work.complete_…

聚观早报 | 天猫2024年投入5亿元;英伟达市值再创新高

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月11日消息 天猫2024年投入5亿元 英伟达市值再创新高 IAR全面支持小华全系芯片 紫光云发布紫鸾5.0云平台 首家…

大话设计模式——5.代理模式(Proxy Pattern)

1.定义 为其他具体对象提供一种代理用以控制对这个对象的访问&#xff0c;属于结构型模式。 UML图&#xff1a; 2.示例 生活中有许多的代理&#xff0c;如房产中介&#xff0c;房主出售的房子挂在中介处&#xff0c;中介帮忙寻找需要的客户&#xff0c;客户不需要直接接触房…

YOLOv9环境搭建推理测试

引子 对于CV从业者来说&#xff0c;YOLO系列是个绕不过的经典结构&#xff0c;笔者遥想当年YOLO横空出世的时候&#xff0c;Faster RCNN还是学术界目标检测的翘楚。二阶段检测还是大行其道&#xff0c;不过时至今日&#xff0c;估摸着没有人再提二阶段目标检测的结构了。YOLO系…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

ChatGPT+MATLAB应用

MatGPT是一个由chatGPT类支持的MATLAB应用程序&#xff0c;由官方Toshiaki Takeuchi开发&#xff0c;允许您轻松访问OpenAI提供的chatGPT API。作为官方发布的内容&#xff0c;可靠性较高&#xff0c;而且也是完全免费开源的&#xff0c;全程自己配置&#xff0c;无需注册码或用…

【超级干货】播放器核心知识点-音视频同步原理深入剖析

引言 本文是自己学习利用ffmpeg实现音视频同步播放的总结文档,参考了网上一些博客,同时调试ffplay源码进行理解,站在巨人的肩膀上学习,感谢开源和分享精神。文中粘贴的代码每行都有注释,确保读者能理解所涉函数的每一行代码的意义。 章节 因为ffplay源码阅读起来比较复…

TripoSR:开源3D重建模型,0.5秒就能完成2D到3D图转换

TripoSR是由Tripo AI和Stability AI合作开发的最先进的开源模型&#xff0c;用于从单个图像中快速前馈3D重建。在NVIDIA A100 GPU上不到0.5秒就能生成高质量的3D模型。 项目链接 https://github.com/VAST-AI-Research/TripoSR TripoSR利用大型重建模型(LRM)的原理&#xff0c;…

恒峰便携式森林灭火泵:森林守护者的强力助手

在茂密的森林中&#xff0c;一场突如其来的火灾可能会带来无法估量的破坏。这不仅会对生态环境造成严重影响&#xff0c;还可能危及人类和动植物的生命安全。为了应对这种突发情况&#xff0c;恒峰研发出了一种便携式森林灭火泵&#xff0c;它成为森林守护者的强力助手。 首先&…