函数入门(入详解)

 

1·引言

在生活中,不知道大家平时有么有拼过积木,每一个积木块就像一个函数,通过不同积木的组合,组成一个庞大的,有趣的模型,同c语言一样,通过函数的组合完成一个个庞大的工程。

2·介绍

在c语言中,函数(Function)是一个执行特定任务的代码块。它允许你将代码组成可重复使用的单元,这样可以提高代码的效率和可读性,其次有模块化,减少错误,便于测试代码等好处,函数可以接受输入(参数),执行一些操作,然后返回结果。

优点

1.代码复用:写出一个函数后可以在需要的地方多次调用,在形式上,看上去更加简介,便于观看。

2.模块化:函数将一个庞大的工程分成许许多多的小的函数,每个函数只执行一小部分的特定内容,这使得代码结构更加清晰,更便于理解和维护。

3.抽象:函数提供了一种抽象机制,允许我们藏匿实现细节,只暴露必要的接口。使得调用者无需了解函数内部,只需要知道如何使用。

4.减少错误

5.提高代码可读性:良好的函数名可以让我们更加清晰的理解函数。

3使用规则

/*1*/int name(/*2*/int x,int y)
{
   return x+y;
}

创建一个函数要有:返回类型,函数名,函数参数,函数体。

第一个注释后面的int就是函数的返回类型,函数类型有很多种,比如char,int,void......

在这里如果不写函数的返回类型默认值就是int。

在这里提出一个特殊的类型void--表示空的意思,这个void可以写在函数返回值,函数参数。在函数返回类型表示什么都不返回,无返回的函数;这个void写在函数参数的地方,表示无传参函数。也可以放在return后面,用来表示函数无返回值。

函数参数

在圆括号中的的就是函数参数,常见的有以下四种:

int name();
int name(void);
int name(int a......);
int name(int a=0,int b=1);

第一种和第二种其实都是一种无参数函数只是写法不同而已,在这里再次说明,void这个关键字就是表示空的意思,函数不写参数时就是默认为无参函数。

第二种就是不带有初始值得有参函数,它可以是一个或者多个,类型一般为:整形,字符,指针等。如果在有参函数使用时,又没有进行初始化参数就会出现报错:fe12fb702f88442c8e64797abc83c4fe.png

所以就出现了第四种书写函数参数的方法,带有默认值的有参数函数,当你不给它传入具体参数时,函数依旧能够运行,会使用默认参数进行函数运行。这种有初始化的有参函数,在开始书写时可能有些麻烦,但是可以减少报错,但是同时当我们没有进行传参或者少传参就会导致函数返回结果出现问题,或不是目标结果。需要自身对函数使用有一定的熟练度。

return返回值

return返回的值跟最开始的返回类型有关联,在我们创建函数时,一般都是先不写函数的返回类型,是在我们确定好需不需要返回值,在确定返回类型后再写函数返回类型。

return 后可以是变量,常量,表达式,函数调用,条件表达式,宏,空void。在函数中,一旦函数运行碰到了return,就会立即退出函数。

函数名

与命名变量名字差不多,没有特比的限制规定,不可以是关键字,其次有几点建议——1.尽可能的将函数名命名的简单易懂2.尽量用同一种语言去命名,不要中英结合3.主要每一个单词的大小写尽量用峰式命名法(每一个单词的首字母大写)

一个简单的案例-----交换数字

int char(int a,int b)
{
  int c;
 c=a;
 a=b;
 b=c;

}
void main()
{
 int n=20;
 int m=30;
 char(n,m);
printf("%d %d",n,m);
}

n=20 m=30

在上述代码中涉及了一个基本问题——函数的调用

在调用函数时一种就是上面一样不需要它的返回值,直接调用的;但还有需要返回值的时候,这时就需要根据返回类型进行相应的类型去与其匹配。

上述代码也就是传参调用函数,但是为什么没有完成相应的效果,这涉及到另一个有点深度的问题:实际参数和形式参数

实际参数:真实传给函数的参数(我们在主函数中调用函数时给函数传的值,如上述的char(n,m)),一般为常量,变量,表达式,函数..........

形式参数:函数名后面括号中的变量,因为形参只有在函数被调用的过程中才会被实例化(分配内存空间),当函数调用结束后,形参就会自动销毁掉,只在函数中能使用。

8de5d281abf54552b50d2a01a0671fe0.png

上述的代码中,n和m就是把自身的真实值传递给了a和b,然后ab进行了数值交换,但是形参属于实参的临时拷贝,修改形参不会将实参同时修改。简单来说,我给予了你力量,怎么折腾是你的事情,跟我没关系。所以ab的交换数值并不会影响到mn。

解决方法有很多,最简单的就是让ab代替mn去将交换值输出出来,将主函数的printf移动到交换函数中去。但是我要说的是另一种在后面编程用的比较多的方法,将传值调用更改为传指调用,简单介绍一下:

传值调用:将自身的数值传递给函数中的形参,对形参的修改,无法影响到实参。

传指调用:把函数外的变量的内存地址传给函数的形参,可以让函数和外边的变量建立起真正的联系,简单来说就是函数内部可以直接操作外边的函数。通俗来讲,我将我的意识附着于他人(形参)的意识之中,可以左右他的行动。

int char(int* a,int* b)
{
  int c;
 c=a;
 a=b;
 b=c;

}
void main()
{
 int n=20;
 int m=30;
 char(&n,&m);
printf("%d %d",n,m);
}

&符号就是将变量的地址取出来的作用,这里是将两个变量的地址作为函数的参数传递给函数,又因为nm是整形,所以用了两个整形指针来接受。

这样在函数内就可以用ab来将mn的只改变了。

4函数的声明与定义

这是一个间单的使用方法,在很多书上,教程上都会看见一些如下的函数:

int name(int,int );这里的分号很重要

声明

1告诉编译器有一个函数叫什么,返回类型是什么,参数是什么,但是具体函数存不存在,声明无法决定(要靠定义来决定)//疑似在网上口嗨,说我是亿万富翁,但是我实际没有,网上说什么是什么,现实=-=。//

2函数声明一般出现在使用之前,先声明后使用,不然会报错——编译器是从上下运行,在主函数中在没有声明函数,又把函数定义写在了主函数后面就会出现无法使用的的情况。

定义

函数的具体实现,交代函数的功能实现。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值