c语言--函数
初识c语言,东西比较杂乱,所以写来整理,以便后续复习。
1,先看最近遇到的一个问题:写一个函数,它的功能是使a,b两个变量的值交换。
函数的写法如下:
1 | void swap1(int x, int y)//函数定义 |
然后在主函数使用它:
1 | include<stdio.h> |
编译运行后发现:a=20,b=10.也就是说a和b的值并没有交换,写的交换函数出问题了。但回过头来看一看,函数写的好像确实“一点问题都没有”,于是,我们调试这个代码,并监视a,b,x,y的值,发现:当a和b把值传给x,y的时候,x=a=20;y=b=10; 经过函数的作用:x=b=10 ; y=a=20; 终于,明白了问题所在:其实,这个程序交换的是x和y的值,并没有对a和b的值进行交换,但这并不是我们想要的;进一步监视&a,&b发现了这个问题的本质:当a和b把值传给x和y时,x和y在内存中分别开辟了一个空间,这个空间的地址不同于a和b,也就是说我们无论进行什么操作,都是对x和y操作的,并不会对a和b的值产生什么影响。于是我们对这个程序进行改进,使函数内部是对a和b进行操作的。改进后的函数如下:
1 | void swap2(int* pa, int* pb)//这里的pa和pb是指针变量,用来接收a和b的地址//函数定义 |
再把主函数内的swap(a,b)改为swap(&a,&b),这样就把a和b的地址传给swap函数,用指针变量去接收地址,就可以完成值的交换。
其中在函数定义中的x和y,称之为形式参数 (形参)【可以是常量,变量,表达式,函数等】;在函数调用中的a和b称之为实际参数 (实参)【只有在函数被调用的时候才会实例化(分配内存单元)且在函数调用完成之后就自动销毁了,只在函数中有效】
swap1在被调用的时候,实参传给形参,其实形参是实参的一份临时拷贝。所以,改变形参,并不会改变实参。但是swap2中的pa和pb和a,b是对应的。
2,写一个函数,判断它是否为素数
首先,我们要明确如何判断一个数是不是质数,然后再考虑怎么去实现它。
简单的一个思路就是:假设这个数是n,然后n分别除以2——(n-1)(亦或者根号n) 对于依次做除法,可以利用for循环实现,但我们还得考虑,进行完除法操作后,还应该怎么办才能让这个函数发挥作用。
在这里,我用函数的返回值作为信息,以便于在调用时方便使用,即:如果这个数是素数就返回1,否则返回0;
具体函数如下:(这里我们需要判断的数均是大于等于2的)
1 | int prime_judge(int x) |
在程序中调用这个函数:
1 |
|
以上是我的一个小总结,有时间还会总结更多的例子。
3,函数的调用:
函数的调用分为两类,一类是:传值调用(不需要改变主函数中的变量的值,只是把值传过去用一下);另一类是:传址调用(把地址传给子函数,需要时可以改变主函数中变量的值);
4,函数的嵌套调用和链式访问
在c语言的函数中,函数可以嵌套调用:可以在一个函数的内部调用(使用)另一个函数。但是,函数是不可以嵌套定义的:在定义函数的时候,一个函数内部不可以再定义一个函数;
链式访问:简单地来说,就是把一个函数的返回值作为另一个函数的参数;
e.g
1 | printf("%d\n",strlen("abc")); |
在这里strlen函数的返回值作为了printf函数的参数;
值得注意的是:如果把函数定义在了主函数之后,那么在使用子函数的时候遵循**“先声明,后使用”**的原则,告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。