Linux C 函数

目标

函数的声明和定义

函数的返回值

形参与实参

函数的调用

局部变量与全局变量

常用的系统函数


函数的定义与声明


函数的定义如下:


调用函数必须遵循先定义,后使用”的原则。


函数定义的一般格式:


类型标识符 函数名([参数表列]

     [声明部分]

     语句

调用后续声明的函数时,必须再调用之前先进行声明


函数定义需要定义函数头和函数体两部分,函数头包括函数名、函数的类型及形式参数表:

1函数名:用标识符标识,用来标识一个函数的名字,函数名后面必须有一对圆括号。

2函数类型:函数名前的函数类型是指函数返回的类型。函数是整数,int可以省略不写;函数无返回值,以void类型明示;函数无参函数,调用后没有返回值。

3形式参数表:圆括号内为形式参数列表部分,其中的参数称为形式参数,它包括函数的自变量部分。


函数体是函数头下面最外层一对花括号内的代码,它是由一系列语句构成的,用以实现函数的功能,函数体内可以有函数说明、变量及可执行语句。


例如:定义一个函数,用于求两个数中的最大数。

#include <stdio.h>

int max(int n1,int n2)

{

  return(n1>n2?n1:n2);

}

main()

{

  int max(int n1,int n2);

    int num1,num2;

  printf(请输入两个整数:\n);

  scanf(%d%d,&num1,&num2);

printf(max=%d\n,max(num1,num2));

}
Linux C 函数


函数的参数与返回值


函数的参数分为形参和实参两种,作用是实现数据的传送。有参函数在调用时,主调函数和被调函数之间有数据传递,主调函数传递数据给被调函数。主调函数传递来的数据称为实际参数,简称实参


定义函数时,函数名后的参数称为形式参数,简称形参


在定义函数时,系统并不给形参分配单元,当然形参也没有具体的数值,所以称它是形参,也叫做虚参。形参在函数调用时,系统暂时给他分配存储单元,以便存储调用函数时传来的实参。调用函数时,实参有确定的值,所以称它为实际参数。它可以是变量、常量、表达式等任意“确定的值”。


实参和形参之间的关系:

1. 实参的个数、类型应该和形参的个数和类型一致。调用函数时,系统给形参分配存储单元,并且把实参的数值传递给形参。
2. 实参和形参分别属于主调函数和被调函数,具有不同的内存单元。所以,在函数调用时形参发生改变,不会影响到实参。
3. C语言中实参和形参的结合采取的是“单向值传递”方式,只有实参传递参数给形参,形参不回传参数给实参。

例子:实参和形参的结合方式

#include <stdio.h>

main()

{

  float a,b,sum;

  float add(float x,float y);

 scanf(%f,%f,&a,&b);

sum=add(a,b);

printf(sum=%f\n,sum);

}

float  add(float x,float y)

{

 float z;

  z=x+y;

 return z;

}
Linux C 函数


函数的返回值


调用有值函数时,要求被调函数返回数据给主调函数,返回的数据称为函数返回值,简称函数值。得到函数返回值的方法是使用returen语句。

注意:若调用的函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用 “void”定义成“无(空)类型”。

函数的调用

对被调用函数的声明具体形式为:

函数类型 函数名();

C语言中,调用函数的一般形式为:

函数名([实际参数列表]

实际参数列表是函数入口参数的实际值。

注意:实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致,才能正确地进行数据传递。
在C语言中,可以用以下几种方式调用函数:
(1)函数表达式
(2)函数语句
(3)函数实参

例子:编写两个函数分别求两个整数的最大公约数和最小公倍数
#include <stdio.h>
int GCD(int m,int n)
{
     int p;
     while(m&n)
{
    p=m%n;
    m=n;
    n=p;

}

  return n;
}

int LCM(int m,int n)

{
   int p;
   p=m>n?m:n;
   return(m*m/p);

}
main()
{
  int m,n;
printf("请输入m,n的值:\n");
scanf("%d,%d",&m,&n);
printf("最大公约数是:%d,最小公倍数是:%d\n",GCD(m,n),LCM(m,n));
}

Linux C 函数

函数的递归调用

函数的递归调用是函数嵌套调用的特殊形式。一个函数在它的函数体内直接或间接的调用自己的函数称为函数的递归调用。在递归调用中,主调函数又是被调函数。
根据不同的调用方式,递归又分为直接递归调用和间接递归调用。直接递归调用指函数直接调用自身,即递归调用在函数的函数体内,又定义了语句来调用函数自身。间接递归调用指函数互相调用对方。

函数的调用流程:主调用函数——为被调用函数分配的存储空间——从被调用函数头开始执行函数——返回语句——释放被调用函数对应的存储空间——返回主调用函数的调用语句继续执行。

例子:用递归法计算n!
#include <stdio.h>
float fac(int n)
{

if(n==0 || n==1)

return 1;
else
return fac(n-1)*1;
}
main(){
int n;
float y;
float fac(int n);
printf("请输入n的值:\n");
scanf("%d",&n);
y=fac(n);
printf("%d!=%.0f\n",n,y);

}
Linux C 函数


变量的使用范围

在C语言中按照变量的作用范围可以将变量分为局部变量和全局变量两种。

全局变量:不管是主函数还是其他函数,在函数内声明的变量(包括函数参数)统称为局部变量。局部变量的特点是随函数的调用而生成,随函数调用结束而释放。局部变量的作用范围是定义它的函数。它只在定义它的作用域内有效,当退出作用域时,其存储空间被释放

例如:
int f1(int a){
int b,c;
........

}                              /*a,b,c作用域:仅限于函数f1()中*/
int f2(int x){
int y,z;
........

}                            /*x,y,z作用域:仅限于函数f2()中*/
main(){
int m,n;
.......

}                         /*m,n作用域:仅限于函数main()中*/


关于局部变量有以下几点:

1.主函数main()中定义的局部变量,也只能在主函数中使用,其他函数不能使用。主函数中也不能使用其他函数中定义的局部变量。
2.形参变量也是局部变量,属于被调用函数;实参变量,则是调用函数的局部变量。

3.允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4.在复合语句中也可以定义局部变量,其作用域只在复合语句范围内。

全局变量:函数外定义的变量称为全局变量。全局变量可以被定义它的文件中的所有函数使用。全局变量的作用范围是从定义变量的位置开始到它所在源文件结束的位置。但需要注意的是,如果定义了与全部变量同名的局部变量,则局部变量优先。

例子:利用全局变量计算长方体体积及正、侧、顶三个面的面积

#include <stdio.h>
int s1,s2,s3;

int vs(int a,int b,int c){
int v;
v=a*b*c;s1=a*b;s2=b*c;s3=a*c;
return v;

}
main(){
int v,l,w,h;
printf("请输入长方体的长,宽,高:\n");
scanf("%d,%d,%d",&l,&w,&h);
v=vs(l,w,h);
printf("v=%d  s1=%d  s2=%d  s3=%d\n",v,s1,s2,s3);
}

Linux C 函数


关于全局变量有以下几点:

1.全局变量可加强函数模块之间的数据联系,但又使这些函数依赖这些全局变量,因而这些函数的独立性降低。
2.在同一源文件中,允许局部变量和全局变量同名。在内部变量的作用域内,全局变量将会被屏蔽而不起作用。
3.全局变量的作用域是定义点到本文件结束。全局变量说明的一般形式:extern 数据类型 全局变量[,全局变量2..];
注意:全局变量的定义和局部变量的说明是两回事。全局变量的定义,必须在所有的函数之外,而只能定义一次。而全局变量的说明,出现在要使用该全局变量的函数内,而且可以出现多次。
变量的存储类别
C语言中变量不仅又类型事件,而且还有存储类被的属性。完整的变量定义应该确定他的两种属性:存储类型和数据类型。变量定义的完整形式为:[存储类型] 类型说明符 变量名列表;
变量占用内存单元的时间称为“生存期”,变量的生存期是由变量的存储位置决定的。程序中使用的数据可存放在CPU的寄存器和内存器中
CPU寄存器:CPU寄存器中存储的数据是动态存储数据,不能长期占用。
内存储器:内存*用户使用的存储空间分为代码区与数据区两个部分。
变量存储在数据区,数据区又可分静态存储区与动态存储区。静态存储区是在程序运行期间给变量分配固定存储空间的方式。动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。
存储类别有自动、寄存器、静态及外部四种。静态存储类别与外部存储类别存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别变量直接送寄存器。


常用的Linux C 函数

终端控制与环境变量设置函数

1.getopt()分析命令行参数
2.ttyname()返回一终端机名称

日期时间函数

1.time()取得目前的时间
2.ctime()将时间和日期以字符串格式表示
3.gmtime()取得目前的时间和日期
4.difftime()计算时间差距

字符串处理函数

1.index()查找字符串中第一个出现的指定字符
2.strcat()连接两个字符串
3.strcmp()比较字符串
4.strcpy()复制字符串

常用数学函数

1.abs()计算整型数的绝对值
2.cos()取余弦函数值
3.ceil()取不小于参数的最小整型数
4.exp()计算指数
5.sqrt()计算平方根值

数据结构及算法函数

1.crypt()将密码或数据编码
2.bsearch()二元搜索
3.lfind()线性搜索
4.lsearch()线性搜索
5.rand()产生随机数
6.srand()设置随机数种子