1.函数的基本概念
函数包括:函数名,返回值类型,参数
库函数
函数
自定义函数
2.库函数
C语言本身自带的函数,使用库函数,需要声明头文件。
(1)strcpy函数
字符串拷贝函数 <string.h>
strcpy(目的地,源头)//要保证源头<=目的地1,否则溢出。
例:strcpy(arr2,arr1)//将arr1中的内容拷贝给arr2,连带 \0 也会被拷贝过去,作为字符串结束的标志。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//strcpy函数
int main()
{
char arr1 [] = "hello";
char arr2 [] = "###########";
strcpy(arr2,arr1);
printf("%s\n",arr2);
printf("%s\n",arr1);
return 0;
}
(2)memset函数
memset(地址,valve,num);
地址通常是字符数组名(首元素地址)
把地址后num个字节设置成valve这个值,所以通常是对字符串数组内容替换修改。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//memset函数
int main()
{
char arr [] = "Hello,World!";
memset(arr,'2',2);
printf("%s\n",arr);
return 0;
}
3.自定义函数
自定义函数:
返回值类型 函数名(参数)
{
函数体;
}
(1)交换两个整型变量的内容
实参
函数参数
形参
形参和实参占不同的内存块,当实参传给形参时,形参只是实参的一份临时拷贝,对形参的改变不会影响实参。
形参就好比是一个戏中的角色是唯一的
实参就好比是一个戏中的演员,并不唯一。
传值调用:例:Swap(a,b);
void Swap(int x,int y);
形参改变不会改变实参
传址调用:例:Swap(&a,&b);
void Swap(int* x,int* y);
形参改变会改变实参
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//交换两个整型变量的内容
void Swap (int* x,int* y)
{
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 0;
int b = 0;
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
Swap(&a,&b);
printf("交换后为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
(2)判断素数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//判断素数
void is_prime (int x)
{
int i = 0;
for(i=2;i<=sqrt(x*1.0);i++)
{
if(x%i==0)
{
printf("该数不是素数\n");
break;
}
}
if(i>sqrt(x*1.0))
{
printf("该数是素数\n");
}
}
int main()
{
int a = 0;
printf("请输入要判断的数:");
scanf("%d",&a);
is_prime(a);
return 0;
}
(3)判断闰年
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//判断闰年
void is_leap_year (int x)
{
if((x%4==0 && x%100!=0)||(x%400==0))
{
printf("%d是闰年\n",x);
}
else
{
printf("%d不是闰年\n",x);
}
}
int main()
{
int year = 0;
printf("请输入年份:");
scanf("%d",&year);
is_leap_year(year);
return 0;
}
(4)整形有序数组的二分查找
数组元素地址连续,在函数传参时,数组只传数组首元素地址。(数组名为数组首元素地址)
所以在函数外部计算好数组元素个数后再传入函数内部
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//整型有序数组的二分查找函数
void binary_search (int arr [],int k,int sz)
{
int left = 0;
int right = sz-1;
int mid = 0;
while(left<=right)
{
mid=(left+right)/2;
if(arr[mid]>k)
{
right=mid-1;
}
else if(arr[mid]<k)
{
left=mid+1;
}
else if(arr[mid]==k)
{
printf("这个数下标为%d\n",mid);
break;
}
}
if(left>right)
{
printf("不存在这个数\n");
}
}
int main()
{
int arr [] = {1,2,3,4,5,6,7,8,9,10};
int k = 0;
int sz = (sizeof(arr)/sizeof(arr[0]));
printf("请输入要查找的数:");
scanf("%d",&k);
binary_search(arr,k,sz);
return 0;
}
(5)每调用一次函数,num的值加1
传址调用 -> 解引用操作 (*p)++;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//每调用一次函数,num的值加1
void Add (int* p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("num=%d\n",num);
Add(&num);
printf("num=%d\n",num);
Add(&num);
printf("num=%d\n",num);
return 0;
}
4.函数的嵌套调用
函数嵌套:在一个函数内部调用另一个函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.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;
}
5.函数的链式访问
链式访问:把一个函数的返回值作为另一个函数的参数
例:printf函数的返回值是打印字符的个数,\n也算。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//函数的链式访问
int main()
{
printf("%d\n",printf("%d\n",printf("%d\n",43)));
printf("%d",printf("%d",printf("%d",43)));
return 0;
}
6.函数的声明、定义、调用
.c主函数源文件中调用自定义函数用" ",例:#include "Add.h"
(1)函数声明
.h函数头文件
#define _CRT_SECURE_NO_WARNINGS 1
//函数声明
int Add (int x,int y);
(2)函数定义
.c函数定义源文件
#define _CRT_SECURE_NO_WARNINGS 1
//函数定义
int Add (int x,int y)
{
int z = x+y;
return z;
}
(3)函数调用
.c主函数源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "Add.h"
//函数调用
int main()
{
int a = 0;
int b = 0;
int sum = 0;
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
sum=Add(a,b);
printf("sum=%d\n",sum);
return 0;
}