摘要:无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。形式参数当函数调用完成之后就自动销毁了。函数的声明一般出现在函数的使用之前。函数的声明一般要放在头文件中的。
我输入strcpy后
#include#includeint 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 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("###################");}
#includeint 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;
上代码
#includevoid 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;}#includeint 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;}#includeint 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);}#includeint main( ){ int m = 0; scanf("%d", &m); Printf(m); return 0;}
可以观察到,为什么呢?????
因为刚开始必须全部完成if语句里面的,完成if后才会编译后面的代码,然后if语句里面全都是Printf函数,所以就一直传递,最后不满足条件是才会退出来,然后开始返回,也就是归。
观察我上面的代码可以发现,递归有限制条件,不妨花点时间思考一下?
如果这两个条件有一个不满足,会发生什么呢??——栈溢出
这个名词也许你不太熟悉,
这是电脑中粗存空间的区域名称,而我们在递归中每调用一次函数,便会在栈区开辟一块空间,如果允许计算机一直开辟空间的话,那么区域便会装不下,这样的话学术人员便为这个取了一个名字——栈溢出。
我们试试栈溢出的情况
void Printf(int x) { Printf(x / 10); }#includeint main( ){ int m = 20; Printf(m); return 0;}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123193.html
摘要:年月日,研究人员通过邮件列表披露了容器逃逸漏洞的详情,根据的规定会在天后也就是年月日公开。在号当天已通过公众号文章详细分析了漏洞详情和用户的应对之策。 美国时间2019年2月11日晚,runc通过oss-security邮件列表披露了runc容器逃逸漏洞CVE-2019-5736的详情。runc是Docker、CRI-O、Containerd、Kubernetes等底层的容器运行时,此...
摘要:因为用户不用在第一次进入应用时下载所有代码,用户能更快的看到页面并与之交互。译高阶函数利用和来编写更易维护的代码高阶函数可以帮助你增强你的,让你的代码更具有声明性。知道什么时候和怎样使用高阶函数是至关重要的。 Vue 折腾记 - (10) 给axios做个挺靠谱的封装(报错,鉴权,跳转,拦截,提示) 稍微改改都能直接拿来用~~~哟吼吼,哟吼吼..... 如何无痛降低 if else 面...
摘要:大家好,我是冰河有句话叫做投资啥都不如投资自己的回报率高。马上就十一国庆假期了,给小伙伴们分享下,从小白程序员到大厂高级技术专家我看过哪些技术类书籍。 大家好,我是...
阅读 3385·2021-11-12 10:36
阅读 2719·2021-11-11 16:55
阅读 2932·2021-09-27 13:36
阅读 1591·2021-08-05 10:01
阅读 3532·2019-08-30 15:55
阅读 745·2019-08-30 13:01
阅读 1871·2019-08-29 17:16
阅读 2355·2019-08-29 16:40