1、函数是什么
子程序,是一个大型代码中一些可以单独实现某些功能的代码块。由函数名,函数参数,返回值类型三大部分组成。提供对过程的封装和细节的隐藏
2、函数的分类
a、库函数:把一些常用的函数集成为库,由c语言直接提供
strcpy 字符串复制函数,头文件<string.h>
例:把arr1[ ]中字符串拷贝到arr2[ ]中
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[ ]="abcdef";
char arr2[ ]="0";
strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
sizeof()返回值的类型是size_t,size_t本质是unsigned int 无符号整型,求大小不会求出负值
memset()把前多少个字符改成别的样子,设置内存的时候是以字节为单位的,每个字节的内容都是一样的。头文件时<string.h>
#include<stdio.h>
int main()
{
char arr[ ] = "hello baby";
memset(arr,'x',5);
//改成memset(arr+6,'x',4);结果是 hello xxxx
printf("%s\n",arr);//打印出来的结果是 xxxxx baby
return 0;
}
b、自定义函数
写一个函数,可以找出两个整数中的最大值
#include<stdio.h>
int get_max(int a, int b)
{
return ((a > b) ? a : b);
}
int main()
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
int max = get_max(x,y);
printf("%d\n", max);
return 0;
}
写一个函数,交换两个数的值。可以用三种方式,数值法,指针法,引用法(C++中可用),前两种c和C++中都可,代码相似,可见上一篇C++引用文章。
3、函数参数
a、实际参数(实参),真实传给函数的参数,可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
b、形式参数(形参),是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才会被实例化(分配内存单元),形参当函数调用完成之后就自动销毁了,因此形式参数只有在函数中才有效。
形参实例化后其实相当于实参的一份拷贝。
4、函数的调用
a、传值调用----函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
b、传址调用----把函数外部创建变量的内存地址你传递给函数参数的调用。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
写一个函数判断一个数是否为素数----用2~n-1试除或用2~sprt(n)试除
#define _CRT_SECURE_NO_WARNINGS
//判断一个数是否为素数,用函数,如果是返回1,不是返回0
#include<stdio.h>
#include<math.h>
int is_sep(int x)
{
int y = 0;
for (y = 2; y <= sqrt(x); y++)
{
if (x % y == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int a = 0;
scanf("%d", &a);
if (is_sep(a) == 1)
{
printf("是素数 %d ", a);
}
else
{
printf("不是素数");
}
return 0;
}
写一个函数判断是否为闰年。
//写函数判断是否为闰年,是闰年返回1,不是返回0
#include<stdio.h>
int is_run(int n)
{
if ((n%4==0 )&&( n % 100 != 0 )||( n % 400 == 0))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int x = 0;
scanf_s("%d", &x);
if (is_run(x) == 1)
{
printf("%d 是闰年。",x);
}
else
{
printf("%d不是闰年", x);
}
return 0;
}
写一个函数,用二分法查找有序数组中的一个数,找到了返回下标,找不到就说找不到。
//写一个函数,用二分查找寻找元素,找到用返回下标,找不到返回-1,数组应有序
#include<stdio.h>
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;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,44,54,64,74,94,104,114,124,134};
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr)/sizeof(arr[0]);
int ret = binary_search(arr, k, sz);
if (ret == -1)
{
printf("找不到");
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
写一个函数,每调用一次函数,num的值加一
#include<stdio.h>
void test(int *p)
{
*p=*p+1;
}
int main()
{
int num=0;
test(&num);
printf("%d\n",num);
return 0;
}
5、函数的嵌套调用和链式访问
(1)、嵌套调用 ,函数可以嵌套调用,不能嵌套定义。
(2)、链式访问,把一个函数的返回值作为另外一个函数的参数,例
#include<stdio.h>
int main()
{
printf("%d\n",strlen("abcdef"));
return 0;
printf的嵌套