首先我们要明白函数是什么。
函数又叫子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。
它负责完成某项特定的任务,而且相比较于其他代码,具有相对独立性。
函数的分类:库函数和自定义函数
库函数:
复制函数:strcpy(),以下是将数组arr2中的数据复制到数组arr1中。
#include<stdio.h>
#include<string.h>//strcpy()函数所需要用到的头文件
int main()
{
char arr1[20] = { 0 };//目的地
char arr2[] = "Hello";//原数据
strcpy(arr1, arr2); //strcpy(目的地,原数据)
printf("%s\n", arr1);//%s 打印出字符串
return 0;
}
自定义函数:
自定义函数和库函数一样,有函数名、返回值类型和函数参数。
输入两个整数,输出较大值。
#include<stdio.h>
int get_max(int x, int y)//定义的函数名为get_max,返回的值为整型,传入的两个数为整型,分别为x,y
{
int z = 0;
z = (x > y ? x : y);//如果x>y成立,z=x;否则,z=y
return z;//返回值为z
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = get_max(a, b);//调用get_max()函数,并定义一个整型的变量m来接收
printf("%d\n", m);
return 0;
}
写一个函数交换两个变量的内容。
方法一(错的)代码虽然没有报错,但是没有实现交换两个变量的内容:
#include<stdio.h>
void swap(int x, int y)//x和y是形参,返回值为空
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前a = %d b = %d\n", a, b);
swap(a, b);//a和b是实参,传值调用
printf("交换后a = %d b = %d\n", a, b);
return 0;
}
方法二(正确):
#include<stdio.h>
void swap(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
printf("%d %d\n", x, y);
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
swap(a, b);
return 0;
}
当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝,所以对形参的修改是不会影响实参的。
方法三:用指针,传地址过去
#include<stdio.h>
void swap(int* pa, int* pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//交换两个变量
printf("交换前a = %d b = %d\n", a, b);
swap(&a, &b);//传址调用
printf("交换后a = %d b = %d\n", a, b);
return 0;
}
函数的参数
1.实参:真实传给函数的参数
实参可以是:常量、变量、表达式、和函数等。
2.形参:形式参数是指函数名后括号中的变量,因为形式参数只能在函数被调用的过程中才能实例化,形参只能是变量
函数的调用
1.传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不影响实参
2.传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量