1.什么是函数
(1)定义:
函数即子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。负责完成某项特定的任务,与其他代码相比,有相对的独立性
2.C语言中的函数分类
(1)库函数:C语言自带的函数
- IO函数
- 字符串操作函数
- 字符操作函数
- 内存操作函数
- 时间/日期操作函数
- 数学函数
- 其他函数
比如:
a.strcpy()函数
char * strcpy ( char * destination, const char * source ); //函数原型int main() { char arr1[20] = {0}; char arr2[] = {"你好呀!!!"}; strcpy(arr1,arr2); //(目标数组,源头数组) printf("%s\n",arr1); return 0; }b.memset()函数
void * memset(void * prt ,int value, size_t num); //函数原型int main() { char arr[20] = {"hello world"}; memset(arr,'1',5); // 没有指定从数组哪个位置开始替换,默认为首个元素,即下标为 0 // memset(arr+5,'a',3); // 指定从数组元素下标为 5开始替换===> helloaaarld printf("%s\n",arr); return 0; } // ===> 11111 world(2)自定义函数
和库函数一样,有函数名、返回值类型和函数参数(一般有)。格式如下:
re_type fun_name(para1, *) // re_type:返回值类型 ; fun_name:函数名; para1:函数参数 //函数体: { statement; //语句项 }举例:写一个函数交换两个整型变量的内容
void Swap(int x,int y) { int temp = 0; temp = x; x = y; y = temp; } int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); printf("交换前:%d, %d\n",a,b); // 交换 Swap(a,b); printf("交换后:%d, %d\n",a,b); } // ===> 交换前: 10 20 // 交换后: 10 20解引用交换值:
void Swap(int *px,int *py) { //*:解引用操作符, *px ,即将 px指针所指向的地址中的内容/值取出来(px指向的元素),a => *px,即取a的值 //*px: 包括了地址内所存的内容(a的值) int temp = 0; temp = *px; // temp = *py 的值 temp里面存的是从px这个地址取回来的值,px是地址,*取内容,&取地址 *px = *py; // *px 所指地址的内容 = *py 所指地址的内容 *py = temp; // *py 所指地址的内容 = *py的值 } int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); printf("交换前:%d, %d\n",a,b); // 交换 Swap(&a,&b); // 获取地址,把a,b的地址中的值进行更改 在地址中改值 printf("交换后:%d, %d\n",a,b); }(3)总结:(需要传地址/不需要传地址)
需要对实参进行修改时,传地址(使用指针)
3.函数的参数( 形参和实参命名可以一致 )
- 当实参传值给形参(具有独立的空间)时,形参是实参的一份临时拷贝
- 对形参的修改不会影响实参
(1)实际参数:真是传给函数的参数(即调用函数时,括号中的内容)
a.实参可以是:常量、变量、表达式、函数等
int Add(int x,int y) { return (x+y); } int main() { int a = 0; int b = 9; Add(3,9); //实参为:常量 Add(a,b); //实参为:变量 Add(b+8,b); //实参为:表达式 Add(Add(b-2),a+1); //实参为:函数 }b.无论实参是何种形式、何种类型,在进行函数调用时,都必须有确定的值,以便传给形参
(2)形式参数:调用函数时,函数名后括号中的变量
a.由于形式参数只有在函数被调用时才会被实例化(分配内存单元)—— 形式参数
int fun_name(int a, int b) // a,b为形式参数 { ... } int main() { ... }b.形式参数只在函数体中有效:形参当函数调用完成后就自动就会自动销毁
4.函数的调用
(1)传值调用:函数的形参和实参分别占用不同的内存块(地址),对形参的修改不影响实参
Swap(a,b)(2)传址调用
a.把函数外部创建的内存地址传递给函数参数的一种调用函数的方法
b.可以让函数和函数外部的变量建立联系——函数可以直接才做函数外部的变量
Swap(&a,&b)