先看一个简单的函数 实现的就是将数组里面的数加起来
\t 缩进相当于Tab键 int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; for (int i = 0; i < 10; ++i) a[i] = add(a[i], i); for (int i = 0; i < 10; ++i) printf("%d\t", a[i]); int add(int x, int n) { return (x + n); }
先看库函数的使用 也就是c自带的函数
像printf scanf函数都是c自带的库函数
当然库函数很多很多:
这里给三个地方参考
https://zh.cppreference.com/w/cpp
https://zh.cppreference.com/w/cpp
https://blog.csdn.net/weixin_44793491/article/details/107644666
那简单举几个例子:
// strcpy(char *dest,char *src) 把src所指由NULL结束的字符串复 char a1[]="abc"; char a2[10]="12345"; strcpy(a2,a1); printf("%s\n",a2); 输出结果为abc
可以发现 abc连同\0也复制到了a2数组里(替代了原来的1 2 3 4) 而打印遇到\0就会结束 所以5不会打印
//void *memset(void *buffer, int c, int count) 把buffer所指内存区域的前count个字节设置成字符c char a3[]="hello world"; memset(a3,'*',5); printf("%s\n",a3); 输出结果为 ***** world 参照参数就可以
自定义函数
我们可以发现关于一个自定义函数分为三步 //函数声明 int fang_max(int a, int b); int fang_min(int x, int y); int main{ //自定义函数 求两个数的较大值和较小值 int a=10,b=55; int min=fang_min(a,b); //调用函数 printf("较小值为:%d\n", min); printf("较大值为:%d\n", fang_max(a,b)); //调用函数 } // 函数定义 int fang_min(int x, int y) { return x<y?x:y; } int fang_max(int x, int y) { int max=x>y?x:y; return max; }
这里是一个重点 关于函数传值的
官网语言:值传递是将实际参数复制一份副本传递到函数中 在函数内部对参数进行修改 而不会影响到实际参数 改变形参的值不会影响实参的值 因为其都有独立的空间 //写一个函数 交换两个整形变量的内容 int c=50,d=20; //传值 调用函数 fang_swap(c,d); void fang_swap(int x, int y) { //x,y形参有自己独立的内存空间(地址不同于实参c,d) //值不会交换 int tem=0; tem=x; x=y; y=tem; }
那如何呢:
址传递 void fang_swap2(int *x, int *y); fang_swap2(&c,&d); void fang_swap2(int *x, int *y) { int tem=*x; *x=*y; *y=tem; }
看两个练习题:
// // Created by 28418 on 2024/5/6. // #include<stdio.h> #include<math.h> int is_prime(int n); int main() { // 函数 打印100-200之间的素数 //质数又称素数 一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除 //如果一个数可以写成 i=a*b 那a或者b 一定<=根号i for (int i = 100; i < 201; ++i) { if (is_prime(i) == 1) printf("%d ", i); } } // 从2到n-1试除 int is_prime(int n) { for (int j = 2; j <= sqrt(n); j++) { if (n % j == 0) { return 0; } } return 1; }
// // Created by 28418 on 2024/5/6. // #include<stdio.h> void add(int *x); int main() { //函数每执行一次 num就加1 int num = 0; for (int i = 0; i < 3; ++i) { add(&num); printf("%d ", num); } } void add(int *x) { // *x++; 错误 ++优先级高 写成(*x)++; ++*x; }
函数的多层嵌套调用
大致就是函数里面再调用函数
例如: printf("%d ", printf("%d ", printf("%d ",43))); 输出的为 43 2 1
返回值为整形int 打印屏幕上显示的个数43 2个数字 所以打印2 2一个数字 所以打印1
后续会用到的.h和.c文件
// // Created by 28418 on 2024/5/6. // #include<stdio.h> #include "add.h" int main(){ //函数声明在头文件中 定义在一个源文件中 如果其他源文件要调用include //例如:add int a=5,b=5; printf("%d ",sum(a,b)); } 头文件: // // Created by 28418 on 2024/5/6. // #ifndef PROJECTS_ADD_H #define PROJECTS_ADD_H #endif //PROJECTS_ADD_H int sum(int x,int y); 源文件:实现函数功能: // // Created by 28418 on 2024/5/6. // #include<stdio.h> int sum(int x,int y){ return x+y; }
我用的是Clion 别忘记在CMakeLists.txt中加入
add_executable(projects
大致就是将来会写很多很多文件 相同的部分就用一个头文件或者源文件实现
递归函数
说之前请注意一个问题 就是递归函数可能导致栈溢出
例如:
int main(){ //会导致栈溢出 printf("哈哈"); main(); }
来看看几个例子 使用递归函数实现:
#include<stdio.h> void print(int x); int main() { //输入1234 打印1 2 3 4 //递归函数来实现 unsigned int num = 0; scanf("%d", &num); print(num); } void print(int x) { if (x > 9) { print(x / 10); // 123 } printf("%d ", x % 10); } 为何能实现呢
咱来好好刨析一下:
断点看看:
还是手写吧意思呢就是返回后是返回的上一层调用它的
还有另外一个例子:
#include<stdio.h> int my_strlen(char *str); int main() { //不创建临时变量 求字符串长度 //递归函数实现 char arr[] = "gao"; // printf("%d ",strlen(arr)); int len = my_strlen(arr); printf("%d", len); } int my_strlen(char *str) { //不允许临时变量v // int count = 0; // while (*str != '\0') { // count++; // str++; // } // return count; if (*str != '\0') { return 1+ my_strlen(str+1); } else{ return 0; } }
再来一个求n的阶乘
#include<stdio.h> int Facl(int x); int Facl2(int x); int main() { //求n的阶乘 //使用递归的方式 int n; printf("请输入n的值:"); scanf("%d", &n); printf("%d的阶乘为:%d\n", n, Facl(n)); printf("%d的阶乘为:%d", n, Facl2(n)); } int Facl(int x) { int sum = 1; for (int i = 1; i < x + 1; ++i) { sum *= i; } return sum; } int Facl2(int x) { if(x<=1){ return 1; } else{ return x*= Facl2(x-1); } }
大致到这里了 后续整理函数题目练习
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库