Linux编程预习-函数

1.函数如何进行定义


1)函数简介:函数是C语言程序的基本模块,函数一般可以从3中角度进行分类:

从函数定义角度:
1)库函数:库函数由C系统提供,用户无需定义,可以直接调用。
2)用户自定义函数:用户自己编写的函数,在调用的函数中还必须对被调用函数进行类型说明才能使用。
从返回值角度看:
1)有返回值的函数:有返回值的函数在被调用后将向调用者返回一个执行结果,这个结果就是返回值,用户在定义这种函数时应该说明返回值类型。
2)无返回值函数:无返回值函数用于完成某项特定的功能,执行完成后不用返回函数值,用户定义时声明这种函数的返回值为空类型,即void。
从数据传输来看:
1)无参函数:无参函数是指函数在定义和调用中均不带参数,调用和被调用函数之间不进行参数传递。
2)有参函数:参数包括形式参数和实际参数,在函数定义和说明时的参数称之为形参,调用时给出的函数称之为实参。
2函数的定义
定义的一般形式:
类型说明符函数名(类型名 形式参数1,类型名 形式参数2,.....)
{
函数体
}
函数名:是一个标示符,取名要求有意义、简短,同一源程序文件中不能重名。
类型说明符:值函数的返回值类型,使用void来指定函数无返回值,返回值类型可以是基本类型也可以是指针、结构体和用户自定义类型。
形式参数:定义函数时的参数称之为形式参数,参数列表说明了参数的类型和个数,一下两种方式都是正确的:
intmax(int a,intb){
Return0;
}
intmax(a,b)
inta,b;{
Return0;
}
函数体:即函数具体功能的实现。


2.怎么编写有多个返回值的C语言函数

全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。


3.函数的调用

除去scanf和printf两个函数外,任何系统标准函数的调用都必须在本文件的开头用编译预处理命令#include将函数所在的头文件信息包含到本文件中。例如:#include"stdio.h"
如果被调用的函数是用户自己定义的函数,除了对函数功能的定义以外,通常还应在主调用函数或主调函数所在的源文件中对被调用函数进行声明,其目的是指出被调用函数的返回值类型和参数的个数和类型,以便在调用该函数时系统按此进行检查。
声明函数的一般格式是:
类型标示符函数名(参数类型1,参数类型2,...);
调用函数和主调用函数的位置关系主要分为三种情况:
1调用函数和主调用函数在同一文件中,且主调函数在调用函数的前面。
2调用函数和主调用函数在同一文件中,且主调函数在调用函数的后面。
3调用函数和主调用函数不在同一文件中。


4.形式参数与实际参数的区别

   形式参数:定义函数时函数名后面括号中的变量名

   实际参数:调用函数时函数名后面括号中的表达



5.参数传递
形式参数和实际参数
参数传递中的数据变化:
#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函数中也不可用,函数调用结束后,形参空间撤销,流程返回。这就是值传递。


6.回调函数与普通函数的区别

1)对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”

2)对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调,这正是回调函数名称的由来。



7.数组作为函数的参数

当数组作为参数传递时,系统就会将作为实参的数组元素首地址传递给形参所表示的数组名,即参数传递时地址传递。
一维数组作为参数:一维数组名表示数组中下标为0的元素在内存中的起始地址。假设数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针型数据。
数组作为参数传递的例子代码:
#include  "stdio.h"
void  input(int a[10],int n) {              /*输入函数*/
int i;
for(i=0;i<n;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<n;i++) 
   if (m<a[i]) m=a[i];
return m;
}
void print(int a[10],int n) {               /*输出函数*/
int i;
for(i=0;i<n;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);
}
地址传递就是形参和实参同时指向同一个地址,修改在改存储单元上的数据。


8.函数的执行过程
 
   1)通过函数名,找到函数的入口地址;

   2)给形参分配空间;

   3)值传递;

   4)执行函数体的语句;

   5)返回值;

   6)释放空间。


9.参数传递的两种方式

  1)值传递方式方式:

  函数调用时,为形参分配单元,并将实参的值复制到形参中;

  调用结束,形参单元被释放,实参单元仍保留并维持原值;

  特点:

  形参与实参占用不同的内存单元;  单向传递

  2)地址传递方式:

     函数调用时,将数据的存储地址作为参数传递给形参

   特点:

   形参与实参占用同样的存储单元;

  “双向”传递;

   实参和形参必须是地址常量或变量;


10.函数调用的形式:

  1)作为函数语句调用。函数一般无返回值。例:

           printf(“Hello,World!\n”);

  2)作为函数表达式调用。例:

          m=max(a,b)*2;

  3)作为函数参数调用。例:

          printf(“%d”,max(a,b));

          m=max(a,max(b,c));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值