函数是什么?

数学中我们常见到函数的概念。维基百科中对函数的定义:子程序。

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

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

C语言中函数的分类

      1.库函数:C语言本身提供给我们的函数。

      2.自定义函数

库函数:

库函数学习:打开网站:www.cplusplus.com、http://en.cppreference.com

简单的总结,C语言常用的库函数都有:

IO函数;

字符串操作函数;

字符操作函数

内存操作函数

时间/日期函数

数学函数

其他库函数

自定义函数:

      自定义函数和库函数一样,有函数名,返回值类型和函数参数。但不一样的是这些都是我们自己来设计的。这给程序员一个很大的发挥空间。

ert_type fun_name(para1,*)
{
statement;//语句项
}
//ret_type-返回类型
//fun_name-函数名
//paral-函数参数

示例1:写一个函数找出两个整数中的较大值

#include<stdio.h>
//定义函数
int get_max(int x, int y)
{
if(x>y)
return x;
else
return y;
}

int main()
{
int a = 10;
int b = 20;
int max = get_max(a, b);
printf("max = %d\n", max);
return 0;
}

示例2:写一个函数交换两个整型变量的内容

#include<stdio.h>
void Swap(int* pa, int* pb)//void表示没有返回值
{
int tmp = 0;
tmp = *pa;//*pa、*pb解地址
*pa = *pb;
*pb = tem;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);//取a、b的地址
printf("a=%d b=%d\n", a, b);
return 0;
}

函数的参数:

实际参数(实参):

真是传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参。

形式参数(形参):

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

当实参传给形参的时候,形参其实是实参的一份临时拷贝,对形参的修改是不会改变实参的。

函数的调用:

传值调用

函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。

传址调用

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

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

示例3:写一个函数打印100-200之间的素数

#include<stdio.h>
#include<math.h>
//是素数返回1,不是素数返回0
int is_prime(int n)
{
int j = 0;
for(j=2; j<=sqrt(n); j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for(i=100; i<=200; i++)
{
if(is_prime(i) == 1)
printf("%d", i);
}
return 0;
}

示例4:写一个函数判断一年是不是闰年

#include<stdio.h>
#include<math.h>
int is_leap_year(int year)
{
if((y%4==0 && y%100!=0) || (y%400==0))
return 1;
else
return 0;
}

int main()
{
int year = 0;
for(year = 1000; year<=2000; year++)
{
//判断year是否为闰年
if(1 == is_leap_year(year))
{
printf("%d", year);
}
}
return 0;
}

示例5:写一个函数实现一个整形有序数组的二分查找

#include<stdio.h>
#include<math.h>
// 本质上arr是一个指针
int binary_search(int arr[], int k)
{
//算法的实现
int sz = sizeof(arr)/sizeof(err[0]);
int left = 0;
int right = sz - 1;

while(left <= right)
{
int mid = (left + right)/2;
if(arr[mid] < k)
{
left = mid + 1;
}
else if(arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
//二分查找:在一个有序数组中查找具体的某个数
//如果找到了返回这个数的下标,找不到的返回-1
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
// 传过去的实际是数组arr首元素的地址
int ret = binary_search(arr, k);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}

改:

#include<stdio.h>
#include<math.h>
// 本质上arr是一个指针
int binary_search(int arr[], int k, int sz)
{
//算法的实现
int left = 0;
int right = sz - 1;

while(left <= right)
{
int mid = (left + right)/2;
if(arr[mid] < k)
{
left = mid + 1;
}
else if(arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
//二分查找:在一个有序数组中查找具体的某个数
//如果找到了返回这个数的下标,找不到的返回-1
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
int sz = sizeof(arr)/sizeof(err[0]);
// 传过去的实际是数组arr首元素的地址
int ret = binary_search(arr, k, sz);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}

示例6:写一个函数,每调用一次这个函数,就会将num的值增加1

#include<stdio.h>
#include<math.h>
void Add(int* p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("num = %d\n", num);//1
Add(&num);
printf("num = %d\n", num);//2
Add(&num);
printf("num = %d\n", num);//3
return 0;
}

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

函数和函数之间可以邮寄的组合

嵌套调用

#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}

链式访问

把一个函数的返回值作为另一个函数的参数

int main()
{
int len = 0;
//1
len = strlen("abc");
printf("%d\n", len);
//2
printf("%d\n", strlen("abc"));
return 0;
}
int main()
{
printf("%d", printf("&d", printf("&d", 43)));
return 0;
}//输出结果为4321

函数的声明和定义

函数的声明:

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。

2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。

3.函数的声明一般要放在头文件中。

函数的定义:

函数的定义是指函数的具体实现,教导函数的功能实现。

test.h的内容 放置函数的声明

//函数声明
int Add(int x, int y);

int main()
{
int a = 10;
int b = 20;
int sum = 0;
//函数调用
sum = Add(a, b);
printf("%d\n", sum);
return 0;
}

//函数的定义
int Add(int x, int y)
{
int z = x+y;
return z;
}

学习C语言第四弹:函数(1)_函数