C语言初阶-函数-程序员宅基地

技术标签: 算法  面试  C语言初阶  c语言  开发语言  

1.函数是什么

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

     *在计算机科学中,子程序(Subroutine,procedure,function,routtine,method,subprogram,callable unit),是一个大型程序中的某部分代码,由一个或者多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。

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

2.C语言中函数的分类

2.1库函数

库函数:C语言中把常用的功能,进行了封装,封装成一个一个的函数,提供出来使用:比如printf
C语言并不是直接去实现库函数1,而是提供了C语言标准的和库函数的约定   比如函数的参数  返回值  名字 功能
库函数的实现是靠编译器去实现。

2.1.1为什么会有库函数? 

1.当我们在学习编程的过程中,我们总是会发现我们频繁的使用某一个功能,比如printf,scanf等

2.在编程过程中,我们为了快速的实现某一些功能,比如实现计算一个数的n次方,我们就就会使用到pow,而不是自己再去复制粘贴这么一段功能代码

所以:

像上面描述的基础功能,他们并不是业务性的代码。我们在开发的过程中,每个学者或者程序员都有可能遇到,为了提高可移植性和提高程序的效率,C语言提供了一系列的库函数,方便编程者进行开发。

2.1.2如何学习了解库函数的使用:

推荐一个网址:www.cplusplus.com ,进入过后我们点击c library,就可以看到很多函数库了。

5c6022eb34a74c9689fe642cc498b9e0.png

点击常用的stdio.h文件,就可以找到一些我们常用的函数。

a55f52ca0d1f4c0d956a66c94aaa1338.png

 C语言常用的库函数:
// IO函数   输入输出函数   scanf printf   getchar putchar
// 字符串操作函数   strlen  strcmp
// 字符操作函数   islower isupper
// 内存操作函数
// 时间/日期函数
// 数学函数
// 其他库函数 

2.1.2 如何学习一个库函数 

关注:

1.函数的返回值类型

2.函数的参数个数和参数的返回值类型

3.关注函数的功能

4.每个函数下面也有使用用法举例大家可以直接拷贝代码直接上手体验这个库函数的使用过程。下面我举例一个函数

6c5182af58fc411c8de4cc47ae353fc6.png

2.2自定义函数

有的时候,我们自己想要实现的功能没有库函数的时候,但是多个文件中又要使用到。那么我们就可以把自己的这个功能模块封装成一个函数。自己随时取用就行。自定义函数的形式是什么样的呢?

ret_type  fun_name(para1, *)

{
   statement://语句项

}

ret_type    返回类型

fun_name     函数名

para1            函数参数

举个例子,我们要实现一个加法函数,实现两个数相加

 ret_type    返回类型    我们如果想要返回一个结果,两个数相加的结果是整型,那么返回值就是int 

fun_name     函数名   函数名最好根据功能来,我们实现加法函数,命名为Add

para1            函数参数   函数参数我们是不是要实现两个数相加呀在函数内部,那么我就需要两个数来接收。 两个数都是整型数字那么参数类型就是int ,两个参数可以写为:

int x  int y

我们看一下效果:

 8ea9e90a18654288ab08d011827e0411.png

附上源码大家可以体验效果:

int Add(int x,int y)
{
	int sum = 0;
	sum = x + y;
	return sum;//把结果返回


}
int main()
{
	int a = 1;
	int b = 2;
	int ret = Add(a, b);//调用Add函数
	printf("%d", ret);
	return 0;
}

3.函数的声明和定义

a9b819d06257434d94600a3cdcae6cc9.png

3.1函数的声明(一般可以放在.h头文件中)

什么是函数的声明:

1.告诉编译器一个函数叫什么,参数是什么,返回类型是什么。但是函数具体存在不存在,函数声明决定不了。

比如:

int Add(int x,int y);

但是后面有没有Add函数的具体实现,要看后面的代码,这个声明只是告诉编译器这里有个Add函数。

2.函数的声明一般要出现在函数使用之前,要先声明后使用。编译器要先知道有这个函数,等用到的时候才会去找到这个函数的实现。

3.2 函数的定义(一般放在.c文件中)

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

4.函数的参数

4.1 实际参数(实参)

真实传给函数的参数(一般是调用函数时,写入的参数)

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

不管是什么类型的变量,再进行函数调用时,实参都必须有确定的值

4.2 形式参数(形参)

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

3f1db21c879543dab356bf3603d2a853.png

4.3 关于如何理解形式参数只是实际参数的一份临时拷贝 

(引出函数调用的规则)

我们来看上述函数例子:
我想封装一个函数用于实现两个数值的交换:

06a28df5c2c141cba853a66b9f346cf6.png

我们发现了一个问题

我们实际参数x,y两个数的数值并没有进行交换,函数调用过后,交换的是形式参数a,b两个数的数值。这是怎么回事呢?

我们知道创建变量的实质是分配内存空间,每个内存空间都有自己的地址。

当我们在进行函数传参的时候按照上面的例子来看,我们只是把值传递给了 形式参数,相当于我的代码出了问题我把我的代码拷贝一份给老师,老师在他的电脑上调试运行成功了,但是我电脑上的代码并没有改变。

74641668f99547299bffcfa7d33bc1f5.png

附上源码,大家体验一下效果,在函数调用我们来看一下解决办法:

void Swap(int a, int b)
{
	int temp = 0;
	temp = a;
	a = b;
	b = temp;
	printf("a = %d,b = %d\n", a, b);
}
int main()
{
	int x = 0;
	int y = 0;
	printf("请输入要交换大小的两个数:\n");
	scanf("%d %d", &x, &y);
	Swap(x, y);
	printf("x = %d,y = %d\n", x, y);
		return 0;
}

5.函数的调用

5.1 传值调用

函数的形参和实参分别占用不同的内存块,对形参的影响不会实参,此时形参是实参的一份临时拷贝。

可以看看4.3这里

5.2 传址调用

*传地址调用是吧函数外部创建变量的内存地址传递给函数参数的一种调用方式

*这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

我们来看一下如何用传地址形式传递参数来改变4.3中的错误。

8cc374e7e0af4964b074db950c595316.png

void Swap(int* a, int* b)
{
	int temp = 0;
	temp = *a;
	*a =* b;
	*b = temp;
	printf("a = %d,b = %d\n", *a, *b);
}
int main()
{
	int x = 0;
	int y = 0;
	printf("请输入要交换大小的两个数:\n");
	scanf("%d %d", &x, &y);
	Swap(&x, &y);
	printf("x = %d,y = %d\n", x, y);
		return 0;
}

当我们把地址传给自定义函数时,就可以直接操作我们的x,y了附上源码大家可以试一下

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

6.1 嵌套调用

函数与函数之间是可以相互调用的

就像上面的例子中,我们的加法Add函数和交换函数中又调用了输出函数printf

19abbaf522864209a8e5d8b79451626a.png

int Add(int x, int y)
{
	int sum = 0;
	sum = x + y;
	return sum;//把结果返回


}
void Swap(int* a, int* b)
{
	int temp = 0;
	temp = *a;
	*a =* b;
	*b = temp;
	printf("a = %d,b = %d\n", *a, *b);
	int ret = Add(*a, *b);//嵌套调用Add函数
	printf("%d\n", ret);
}
int main()
{
	int x = 0;
	int y = 0;
	printf("请输入要交换大小的两个数:\n");
	scanf("%d %d", &x, &y);
	Swap(&x, &y);
	printf("x = %d,y = %d\n", x, y);
		return 0;
}

值得注意的是函数可以嵌套调用但是不可以嵌套定义

请看:89620f3b7e914f989a4891e04881e20c.png

6.2 函数的链式访问

函数的链式访问:把一个函数的返回值作为另外一个函数的参数

6f8f9b97e99d450fa698b1a4b4a070df.png

09a5520f9beb4ae1b5830f1b36ffcb52.png

7.函数递归

7.1函数递归

程序调用自身的编程技巧称为递归

递归的思想:大事化小

递归的两个必要条件:

1.存在限制条件,当满足这个条件时,递归就不再继续了

2.每次调用递归过后就会越来越接近这个限制条件

当递归不能跳出就会出行死循环

 我们用一个实例来感受和理解一下递归。

7.1.用递归求n的k次方原理图示 

3cf0a7fd00614951a2ae76ad267aaa9a.png

2ab39d20d4a347309a4f3d3d055596bb.png

上面的图基本说明了原理,下面结合源码理解:

7.1.2.源码 

#include<stdio.h>
double minepow(int n,int k)
{
	if (k == 0)
	{
		return 1;
	}
	else if (k > 0)
	{
		return n * minepow(n, k - 1);

	}
	else
	{
		return 1 / (minepow(n, -k));
	}
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	double ret = minepow(n, k);
	printf("%lf", ret);
	return 0;
}

213642dd51514923ae88952b74e92198.png

 这里类型是double,是因为指数为负的时候,打印的是小数

系统分配给程序的栈空间是有限的,但是如果出现了死循环或者死递归,会导致一直开辟栈空间,最终空间耗尽。这样的现象叫做栈溢出。

y以上就是本期内容,后续会慢慢填补不足之处,也希望得到大家的指正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_71503225/article/details/134124786

智能推荐

【操作系统】从操作系统底层出发,成为更好的程序员_栈式指令集与冯诺依曼-程序员宅基地

文章浏览阅读828次,点赞15次,收藏12次。首先,我们从一个问题开始( ̄∇ ̄)/为什么需要程序员?早期的计算机程序是硬件化的,即使用各种门电路组装出一个固定的电路板,这个电路板只能用于执行某个特定的程序,如果需要修改程序功能,就要新组装一个电路板。而一位叫做冯诺依曼的老爷子的出现,提出了一种指令数据化的思想,使得程序和数据一样,可以存储起来,组合调用,至此,程序脱离了电路板的桎梏,成为了可以人为组合的指令集,程序员应运而生。当然,我们需要郑重地介绍下这位冯老爷子,1903年12月28日—1957年2月8日),原名),出生于的籍与的奠基者,在和。_栈式指令集与冯诺依曼

java-php-python--数字相册管理系统-点赞演示2021计算机毕业设计_php 相册管理系统源码-程序员宅基地

文章浏览阅读247次。springboot基于SpringBoot的创意项目众筹平台的设计与开发。springboot疫情期间中小学生作业线上管理系统设计与实现。jsp基于Web的鲜花采购及预定系统的设计与实现ssh。ssm基于vue技术的汽车维修检测系统设计与实现。ssm基于JAVA的OA办公系统的设计与实现。_php 相册管理系统源码

基于JAVA毕业设计的电脑配件购物商城设计与实现_《基于java毕业设计的电脑配件购物商城设计与实现-csdn博客》-程序员宅基地

文章浏览阅读433次,点赞2次,收藏2次。摘  要本文讲述了基于B/S模式的SSH技术的电脑配件在线销售系统的设计与实现。所谓的电脑配件在线销售系统是通过网站推广互联企业的电脑配件和技术服务,并使客户随时可以了解企业和企业的产品,为客户提供在线服务和订单处理功能。从长期的战略目标来说,电脑配件在线销售网站不仅是电脑配件和服务的推广,而是通过Internet、企业内部网和企业外部网,将买家与卖家、厂商和合作伙伴紧密结合在了一起,因而消除了时间与空间带来的障碍。电脑配件在线销售提供了多种检索途径,可以从分类、新品、特价等途径进行检索,快捷准确._《基于java毕业设计的电脑配件购物商城设计与实现-csdn博客》

Java 保留2位小数点(2种方式)_实体类初始化时保留两位小数-程序员宅基地

文章浏览阅读1.1w次。今天群里有人在处理小数点方面出了点问题,趁机回顾下保留小数点的方式,这里介绍2种,利用BigDecimal类及DecimalFormat类。package com.huayu.java91up;import java.math.BigDecimal;import java.text.DecimalFormat;/** * Create by zxb on 2017/4/17 */_实体类初始化时保留两位小数

VC神经网络算法(matlab算法)(BP神经网络算法预测)-841-代码+说明资料-程序员宅基地

文章浏览阅读690次,点赞17次,收藏10次。比如两个数:100和120,通常我们求平均值时是(100+120)/2 = 110, 如果我们说第一个数的权值为1,第二个数的权值为2,那么平均数是(100*1+120*2)/(1+2)=113.3,这就是加权平均了。abcd四个叶子结点的权值为7,5,2,4. 这个7,5,2,4是根据实际情况得到的,比如说从一段文本中统计出abcd四个字母出现的次数分别为7,5,2,4. 说a结点的权值为7,意思是说a结点在系统中占有7这个份量.实际上也可以化为百分比来表示,但反而麻烦,实际上是一样的.

java/php/node.js/python基于微信小程序的智能学习平台【2024年毕设】-程序员宅基地

文章浏览阅读34次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。

随便推点

PowerBuilder的语言基础-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏15次。 每一种语言都有一组基本的语法约定,POWERBUILDER也不例外。 (1)断行、续行与多条语句 通常情况下,powerbuilder的一条语句是写到一行上的,该条语句在书写完毕之后,按键转到下一行,开始写下一句的内容。也就是说,在PowerBuilder中,使用键作为一行的结束。在PowerBuilder语句比较长的情况下,为了方便阅读,可以使用续行符号把一条语句写到几_powerbuilder

小知识 (2)_int b = max_element(a, a+4) - a;-程序员宅基地

文章浏览阅读126次。1.max_element()函数和min_element()函数,就是找最大值最小值,数组:int position=max_element(a,a+n)-a;//返回在数组中的下标int data=*max_element(a,a+n);//返回值容器: int position=max_element(v.begin(), v.end())-v.begin(); int it..._int b = max_element(a, a+4) - a;

android系统中的log定向___android_log_print 重定向-程序员宅基地

文章浏览阅读885次。android系统中的log定向本文转载自:http://blog.csdn.net/knock/article/details/5511255 为了调试,必须要将log怎么打印的搞清楚,于是有了以下的分析。我们通常在程序中插入LOGD(..),LOGE(..)之类的语句,但什么情况下可以查看这些打印消息呢?首先,来到定义处:system/core/include/cutils___android_log_print 重定向

LIS的nlog(n)算法_nlgzl-程序员宅基地

文章浏览阅读543次。#include #include #include #define maxn 1000using namespace std;int ans[maxn],a[maxn],len;int Search(int data){//我们要找到的是最小的那个>=mid的ans的位置 int l=0,r=len,mid; while(l _nlgzl

牛津书虫系列双语读物_书虫雾都疑案好词好句-程序员宅基地

文章浏览阅读2.6k次。入门级300词汇量,适合小学高年级(五年级,六年级)、初一,分上、中、下三册,共27本。上册共10本,附赠MP3光盘一张1、《生存游戏》2、《侠盗罗宾汉》3、《白色巨石》4、《红酋长的赎金》5、《吸血鬼猎手》6、《逆戟鲸》7、《雾都疑案》8、《亚瑟王传奇》9、《亚瑟王朝里的美国人》10、《把钱拿出来!》中册共9本,附赠MP3光盘一张1、《监控录像》2、《红红的玫瑰..._书虫雾都疑案好词好句

WPS宏插件一直显示bug,有人看的明白么-程序员宅基地

文章浏览阅读46次。Worksheets("数据").Cells(i, 20).Value = Worksheets("替换品名").Cells(j, 2)hr = Worksheets("替换品名").Range("B65536").End(xlUp).Row。dr = Worksheets("数据").Range("T65536").End(xlUp).Row。If Worksheets("数据").Cells(i, 20) "" Then。data = Worksheets("数据").Cells(i, 20)

推荐文章

热门文章

相关标签