索引:


我输入strcpy后

#include<stdio.h>
#include<string.h>
int main() {
char arr2[] = "zhangdashuai";
char arr1[30];
char arr[40];
strcpy(arr1, arr2);
strcpy(arr, "zhangdasa");
printf("%s\n%s", arr1, arr);
return 0;
}
如果有小伙伴英文是在看不懂,这边还有一个中文版的网站
void
void declarator
When used as a function return type, the void keyword specifies that the function does not return a value
但是其他的如果函数返回类型是int float 类型的 ,那么在最后就必须加上return 相应的类型数字。
eg:这个menu函数只是为了打印出我想要的菜单,不需要返回某个值
void menu () {
printf("###################");
printf("####1.play#########");
printf("####0.noplay#######");
printf("###################");
}
#include<stdio.h>
int Add(int x, int y) {
return x + y;
}
int main() {
int a = 8;
int b = 9;
int c = Add(a, b);
printf("%d\n", c);
return 0;
}
函数名的话,就是根据我们想要函数实现的功能,大致翻译成英文即可。
参数,接下来我通过一个代码例子阐述参数的概念——
我现在想创造一个函数,它可以把我穿进去的数字互换一下,,假设我穿进去a=10,b=20,
那么作用使得a=20,b=10;
上代码
#include<stdio.h>
void swap(int x, int y) {
int tam = x;
x = y;
y = tam;
}
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;
}
???
函数好像跟根本没起作用,为什么???
我们要养成一个好习惯,拒绝伸手党,去vs调试一下
我们可以看到,虽然x,y的值跟a,b相等
但是发现他们的地址根本不一样???
为什么?
引入参数的概念
我们的a,b是实参,x,y是形参,我们通过形参想改变实参的关系,结果证明我们光传递值是不可以的,因为传入实参后,形参还会开辟一个新的空间,我是这样理解的
void swap(int* x, int* y) {
int tam = *x;
*x = *y;
*y = tam;
}
#include<stdio.h>
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;
}
我们再调试一下
发现现在x,y的地址和a,b地址相同
这个时候我们通过形参便可以改变实参的关系了。
这个时候可能会有疑问,之前我们的Add加法函数也是是传值调用,为什么还能达到相同的目的呢?第二个swap函数的传值调用为什么不行呢?
我是这样理解的,有return返回值的时候,传值调用和传值调用都可以,但是当没有return返回值,只是执行函数里面的内容是,只有在传址调用时才可以。
我们应该区分出传值调用和传址调用。
总结
四. 函数的嵌套调用和链式访问
函数的嵌套调用就是一个函数里面可以包含使用另外一个函数
eg:
void first() {
printf("hhe");
}
void seond() {
printf("hdg");
first();
}
注*函数可以嵌套调用,但是不能嵌套定义
eg:
void first() {
printf("hhe");
void first() {
printf("hdg");
first();
}
}
这样便是错误的
int Add(int x, int y) {
return x + y;
}
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
int c = Add(Add(a, b), b);
printf("%d\n", c);
return 0;
}
五.函数的声明和定义
void Printf(int x) {
if (x > 9) {
Printf(x / 10);
}
printf("%d ", x % 10);
}
#include<stdio.h>
int main( ){
int m = 0;
scanf("%d", &m);
Printf(m);
return 0;
}
可以观察到,为什么呢?????

因为刚开始必须全部完成if语句里面的,完成if后才会编译后面的代码,然后if语句里面全都是Printf函数,所以就一直传递,最后不满足条件是才会退出来,然后开始返回,也就是归。
观察我上面的代码可以发现,递归有限制条件,不妨花点时间思考一下?
如果这两个条件有一个不满足,会发生什么呢??——栈溢出
这个名词也许你不太熟悉,

这是电脑中粗存空间的区域名称,而我们在递归中每调用一次函数,便会在栈区开辟一块空间,如果允许计算机一直开辟空间的话,那么区域便会装不下,这样的话学术人员便为这个取了一个名字——栈溢出。
我们试试栈溢出的情况
void Printf(int x) {
Printf(x / 10);
}
#include<stdio.h>
int main( ){
int m = 20;
Printf(m);
return 0;
}
