目录
一,了解函数概念
使用函数之前,我们需要了解函数是什么,维基百科对函数有一个定义:子程序
(在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,
subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软
件库。)
那么在我们解决一些比较复杂的问题的时候,可以利用函数的方法来解决问题。
二,库函数
在c语言的学习中,我们实际上会接触到很多库函数,那么库函数的存在实则是为了简化我们的操作,让我们能够更好的解决各类问题,如果想了解更多类型的库函数,可以访问http://www.cplusplus.com,里面不仅介绍了如何使用,也介绍了各种库函数的意义。
三,自定义函数
那么我们平时很多代码的实现不能单纯依靠库函数,我们可以通过自己去定义一些函数来实现,那么我们就必须注意定义函数时候需要注意的问题,当然我们先通过一个简单的函数来简单了解下其运作的方法:
写一个函数可以找出两个整数中的最大值。
#include<stdio.h>
int get_max(int a, int b)
{
return (a > b) ? a : b;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = get_max(a, b);
printf("%d\n", ret);
return 0;
}
这个问题似乎十分容易便解决了,但是当我们想要通过函数的方法,让两个变量的值进行交换时,这样写便产生了问题,此时你可能会发现即使在函数调用完以后,两个变量的值依然是没有任何变化的,那么该如何解决呢?我们可以这么写
#include<stdio.h>
int Swap(int* pa, int* pb)
{
int ret = *pa;
*pa = *pb;
*pb = ret;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = Swap(&a, &b);
printf("%d %d\n", a,b);
return 0;
}
那么大部分人看完以后可能会疑惑了,为什么使用指针的形式来交换呢?那么此时又得引入一个形参与实参的概念。
四,形参与实参
实参:真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形参:形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
那么对于上述的交换swap函数里面,*pa与*pb就是形参,而main函数主体内,想传给函数的a与b就是实参了,形参在使用后实则就是实参的一份临时拷贝。也就是说,当我们想要通过形参对实参进行影响时候,我们需要利用传址调用的方式,也就是上述swap函数的方法,接下来需要了解什么是传值调用与传址调用。
五,函数调用
函数调用分为两种:
传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用:传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
六,函数实例
1. 写一个函数可以判断一个数是不是素数。
2. 写一个函数判断一年是不是闰年。
#include<stdio.h>
int is_prime(int num)
{
int i = 0;
for (i = 2; i <= num - 1; i++)
{
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = is_prime(num);
if (ret == 1)
printf("是素数\n");
else
printf("不是素数\n");
return 0;
}
#include<stdio.h>
int is_leap_year(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return 1;
}
int main()
{
int year = 0;
scanf("%d", &year);
int ret = is_leap_year(year);
if (ret== 1)
printf("是闰年\n");
else
printf("不是闰年\n");
return 0;
}
七,总结
综上所述,当我们想要利用形参对实参进行修改时,我们可以大胆的利用传址调用的方法,可以类似比较为,形参是我们的父母,实参是我们自己,我们足够相信父母,他们可以影响我们,我们可以把我们的所有信息都给他们,让他们来帮助我们进行提升自己。那当我们不需要修改的时候,可以直接使用传值调用的方式。
那么在函数的使用其实比较简单,难点就在于能否理解逻辑,那么接下来的学习过程中,我们可以一边效仿别人的代码的同时去理解他们的逻辑,可以更好的了解函数实现的方法与规律。