一、库函数
1. strcpy----字符串拷贝
把arr1的内容拷贝到arr2
int main() { char arr1[] = "bit"; char arr2[] = "########"; strcpy(arr2, arr1); printf("%s\n",arr2); return 0; }
2. memset函数
用‘ * '代替arr数组前5个字符
int main() { char arr[] = "hello world"; memset(arr, '*', 5); printf("%s\n", arr); return 0; }
二、自定义函数
2.1 实际参数(实参)
真实传给函数的参数,叫实参
2.2 形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
2.3 写一个函数可以交换两个整型变量的内容
*pa,*pb是形参,需要在函数内改变实参的值的时候应该用传址调用
void Swap(int *pa,int *pb) { int tmp = 0; tmp = *pa; *pa = *pb; *pb = tmp; }
&a,&b是实参
int main() { int a = 10; int b = 20; printf("a = %d b = %d\n", a, b); Swap(&a,&b); printf("a = %d b = %d\n", a, b); return 0; }
注意,如果上面采用传值调用, 不能交换两个变量的值,因为a,b传到x,y时x,y也有自己独立的地址,并没有改变x,y的地址,如:
void Swap(int a, int b) { int tmp = 0; tmp = a; a = b; b = tmp; }
三、函数的声明和定义
3.1 函数声明:
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。 - 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的。
3.2 函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
四、函数递归
练习1
调用函数自己本身,例如,接受一个整型值(无符号),按照顺序打印它的每一位。
输入:1234,输出1 2 3 4
执行print时会返回执行上一层没有执行完的print
void print(int n) { if (n > 9) { print(n/10); } printf("%d ", n % 10); } int main() { unsigned int num = 0; printf("请输入一个数字:\n"); scanf("%d", &num); print(num); return 0; }
练习2
编写函数不允许创建临时变量,求字符串的长度
创建临时变量的写法:
int my_strlen(char *str) { int count = 0; //count是临时变量 while (*str != '\0') { count++; str++; } return count; } int main() { char arr[] = "bit"; int len = my_strlen(arr); printf("%d\n",len); return 0; }
不创建临时变量----递归;
递归的方法–把大事化小,首先把字符串首地址传入函数,然后判断字符不是’ \0 '就调用函数本身
my_strlen(“bit”);
1+my_strlen(“it”);
1+1+my_strlen(“t”);
1+1+1+my_strlen(“t”);
1+1+1+0=3;
int my_strlen(char* str) { if (*str != '\0') return 1 + my_strlen(str + 1); //此处str+1是地址,要传到函数去 else return 0; } int main() { char arr[] = "bit"; int len = my_strlen(arr); printf("len = %d\n", len); return 0; }
练习3
求n的阶乘。(不考虑溢出)
int function(int n) { if (n != 0) return n * function(n - 1); else return 1; } int main() { int n = 0; printf("请输入一个数:\n"); scanf("%d", &n); int ret = function(n); printf("ret = %d\n", ret); return 0; }