1.函数
数学:f(x)=2*x+3
计算机:子程序,是一个大型程序中的某部分代码, 由一个或多个语句块组成,它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库
2.C语言中函数的分类
1.库函数
2.自定义函数
2.1库函数
具有基础功能,不是业务性的代码,开发的过程中每个程序员都可能用的到,为了支持可移植性和
提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,把常用的一些功能实现成函数,集成位库,由C语言直接提供C语言标准就可以规定库函数的标准
2.2自定义函数
函数的组成
ret_type fun_name ( para1 , * )//函数体{statement ; // 语句项}//ret_type 返回类型//fun_name 函数名//para1 函数参数
一个例子:写一个函数可以找出2个整数中的最大值
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(num1, num2);
printf("max = %d\n", max);//20
}
又一个例子:写一个函数可以交换两个整型变量的内容
//当实参传给形参的时候,形参是实参的一份临时拷贝,对形参的改变不会影响实参
void swap1(int x,int y)
{
int tmp=x;
x=y;
y=tmp;
}
//正确的版本
void swap2(int* pa,int* pb)
{
int tmp=*pa;
*pa=*pb;
*pb=tmp;
}
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d,b=%d\n",a,b);//a=3,b=5
swap1(a,b);
printf("交换后:a=%d,b=%d\n",a,b);//a=3,b=5
swap2(&a,&b);
printf("交换后:a=%d,b=%d\n",a,b);//a=5,b=3
}
3. 函数的参数
3.1 实际参数(实参):
真
实传给函数的参数,叫实参,实参可以是:常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参
3.2 形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数,形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效
形参实例化之后其实相当于实参的一份临时拷贝
4. 函数的调用:
4.1 传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
4.2 传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
4.3 练习
1. 写一个函数可以判断一个数是不是素数
int is_prime(int n)
{
//2-n-1试除
//或2-sqrt(n)试除
for (int j = 2; j < sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
//打印100-200之间的素数
for (int i = 0; i <= 200; i++)
{
//判断i是否为素数
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
}
2. 写一个函数判断一年是不是闰年
int is_year(int n)
{
if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0))
return 1;
else
return 0;
}
int main()
{
//打印1000-2000之间的闰年
for (int i = 1000; i <= 2000; i++)
{
//判断i是否为闰年
if (is_year(i) == 1)
{
printf("%d ", i);
}
}
}
3. 写一个函数,实现一个整形有序数组的二分查找
int binary_search(int arr[],int k,int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid=left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else return mid;
}
return -1;
}
//找到返回下标,找不到返回-1
int main()
{
int arr[]={ 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
int ret=binary_search(arr,k,sz);
//int ret=binary_search(arr,k);//错误的示范,函数里求不了数组的大小
if (ret == -1)printf("not find\n");
else printf("找到了,下标是:%d\n", ret);
}
4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1
void test(int *p)
{
*p = *p + 1;
//或(*p)++;
}
int main()
{
int num = 0;
test(&num);
}