发布于 

c语言--函数

初识c语言,东西比较杂乱,所以写来整理,以便后续复习。

1,先看最近遇到的一个问题:写一个函数,它的功能是使a,b两个变量的值交换。

函数的写法如下:

1
2
3
4
5
6
7
void swap1(int x, int y)//函数定义
{
int z=0;//引入一个中间变量
z=x;
x=y;
y=z;
}

然后在主函数使用它:

1
2
3
4
5
6
7
8
9
include<stdio.h>
int main()
{
int a=20;
int b=10;
swap1(a,b);//函数调用
printf("%d %d",a,b);
return 0;
}

编译运行后发现: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
2
3
4
5
6
7
void swap2(int* pa, int* pb)//这里的pa和pb是指针变量,用来接收a和b的地址//函数定义
{
int z=0;//引入一个中间变量
z=*pa;
*pa=*pb;
*pb=z;
}

再把主函数内的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
2
3
4
5
6
7
8
9
10
11
12
int prime_judge(int x)
{
int i=0;
for(i=2;i<x;i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}

在程序中调用这个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
if(prime_judge(n)==1)//利用选择语句,结合返回值进行判断
{
printf("%d is a prime.",n);
}
else
{
printf("%d is not a prime.",n);
}
return 0
}

以上是我的一个小总结,有时间还会总结更多的例子。

3,函数的调用:

函数的调用分为两类,一类是:传值调用(不需要改变主函数中的变量的值,只是把值传过去用一下);另一类是:传址调用(把地址传给子函数,需要时可以改变主函数中变量的值);

4,函数的嵌套调用和链式访问

在c语言的函数中,函数可以嵌套调用:可以在一个函数的内部调用(使用)另一个函数。但是,函数是不可以嵌套定义的:在定义函数的时候,一个函数内部不可以再定义一个函数;

链式访问:简单地来说,就是把一个函数的返回值作为另一个函数的参数;

e.g

1
printf("%d\n",strlen("abc"));

在这里strlen函数的返回值作为了printf函数的参数;

值得注意的是:如果把函数定义在了主函数之后,那么在使用子函数的时候遵循**“先声明,后使用”**的原则,告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @Miracle 创建,使用 Stellar 作为主题。