设为首页 加入收藏

TOP

C语言学习笔记(九)--函数(二)
2014-11-24 00:04:19 来源: 作者: 【 】 浏览:69
Tags:语言学习 笔记 函数
n);

p=sumt(n); /*函数调用*/

printf("\n %ld",p);

}

long sum( int m){ /*函数定义*/

int i;

long s=0;

for(i=1;i<=m;i++)

s+=i;

return(s); /*函数返回*/

}

2被调用函数在主函数之前:

#include "stdio.h"

long sum( int m){ /* 函数定义*/

int i;

long s=1;

for(i=1;i<=m;i++)

s+=i;

return(s);

}

main(){

int n;

long p; /*不需函数声明*/

scanf("%d",&n);

p=sum(n); /*函数调用*/

printf("\n %ld",p);

}

3被调用函数在另一个文件中,首先我们设sum()函数存放在fun.c中,则编写主调用函数时需用include命令对被调用函数声明:

#include "fun.c"

main(){

int n=7;

n=sum(n);

}

4参数传递

4.1形式参数和实际参数

参数传递中的数据变化:

#include "stdio.h"

void fun(int num) {

num=20;

printf("%d\n",num);

}

main(){

int x;

x=10;

fun(x); /(调用函数无返回值的函数fun*/

printf("%d\n",x);

}

运行结果:

20

10

函数fun有一个形参变量num,当main函数调用时,实参x的值传送到num,在fun函数中虽然num被修改为20,但是并不影响x的值。

程序从main开始运行,这是x拥有储存空间,初值为10,当fun函数被调用时,为形参分配空间,接受实参的值,流程转到调用函数fun中执行,为变量num重新赋值为20,次数赋值对实参没有影响,同时实参在fun函数中也不可用,函数调用结束后,形参空间撤销,流程返回。这就是值传递。

当函数有多个参数时,在调用实参列表的求值顺序是并不确定的,不同的系统可能不同,如果想知道自己系统的求值顺序可以使用自增、自减来测试:

#include "stdio.h"

int f(int a,int b,int c)

{

int z;

z=a+b*c;

return z;

}

main()

{

int x=3,y;

y=f(x,x++,x++); /*由右至左对实参求值*/

printf("%d\n",y);

}

运行结果:17.

4.2函数的返回值:一个函数的实现都是含有特定的功能,有时函数执行结束后需要将执行结果返回给调用函数,这个结果就可以通过返回值表现出来,返回值使用return语句来实现,具体格式是:

return 表达式; 或return (表达式);

该语句的功能就是返回一个值给主调用函数,释放函数在执行过程中分配的所有空间,结束被调用函数的运行,将流程控制交给主调函数。

如果没有返回值可以使用renturn ;来代替。

float fun(int n){

return n;

}

main(){

float x;

x=f(20);

printf("%f",x);

}

5数组作为函数的参数

当数组作为参数传递时,系统就会将作为实参的数组元素首地址传递给形参所表示的数组名,即参数传递时地址传递。

5.1一维数组作为参数:一维数组名表示数组中下标为0的元素在内存中的起始地址。假设数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针型数据。

数组作为参数传递的例子代码:

#include "stdio.h"

void input(int a[10],int n) { /*输入函数*/

int i;

for(i=0;i

scanf("%d",&a[i]);

printf("\n");

}

int maxa(int a[10],int n) { /*求最大值函数*/

int i;

int m;

m=a[0];

a[1]=100;

for(i=1;i

if (m

return m;

}

void print(int a[10],int n) { /*输出函数*/

int i;

for(i=0;i

printf("%4d",a[i]);

printf("\n");

}

void main() {

int b[10];

int max;

input(b,10);

max=maxa(b,10);

printf("array max is %d\n",max);

printf("the array is :\n");

print(b,10);

}

地址传递就是形参和实参同时指向同一个地址,修改在改存储单元上的数据。

6函数的嵌套调用

C语言中不允许嵌套的函数定义,但允许函数嵌套的调用,即在被调用函数中又调用其他函数。

嵌套调用的程序结构:

哥德巴赫猜想例子代码:

#include "stdio.h"

#include "math.h"

int prime (int); /*函数声明*/

void even(int);

main(){

int n;

printf("Enter n even number(>=6):");

scanf("%d", &n);

if(n%2==0&&n>=6)

even(n); /*函数调用语句*/

else

printf("The %d isn't even number\n",n);

}

void even(int x) { /*找素数函数*/

int i;

for(i=2;i<=x/2;i++)

if(prime(i)) /*调用判断素数函数*/

if(prime(x-i)){

printf("%d=%d+%d\n",x,i,x-i); }

}

int prime(int n) /*判断素数函数*/

{ int i, k= sqrt(n);

for(i=2; i<=k; i++)

if (n%i==0) return 0;

return 1;

}

7函数的递归调用

7.1递归的含义:函数直接或间接的对自己进行调用就是递归。

例如:

int f(int x){

int y;

z=f(y);

return z;

}

这个函数就是递归的调用自己,但该函数会无止境的运行下去,这显然是不正确的,编写代码时应该给程序一个跳出递归的出口。

8练习

1递归求

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言学习笔记(八)--数组 下一篇C语言学习笔记(十)--指针

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: