第十三课(二)、C函数

来源:互联网 发布:淘宝客单页模板 编辑:程序博客网 时间:2024/06/06 11:03


第十三课(二)、C函数

13.5、函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁

当调用函数时,有两种向函数传递参数的方式:

调用类型

描述

传值调用

该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

引用调用

通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

默认情况下,C使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数


传值调用:把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

默认情况下,C语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下:

/*函数定义 */

void swap(int x,int y)

{

  int temp;

 

  temp= x;/*保存 x的值 */

  x = y;   /* y赋值给 x */

  y = temp;/* temp赋值给 y */

 

  return;

}

通过传递实际参数来调用函数 swap()

#include<stdio.h>

 

/*函数声明 */

void swap(int x,int y);

 

int main()

{

  /*局部变量定义 */

  int a=100;

  int b=200;

 

  printf("交换前,a的值:%d\n", a );

  printf("交换前,b的值:%d\n", b );

 

  /*调用函数来交换值 */

  swap(a, b);

 

  printf("交换后,a的值:%d\n", a );

  printf("交换后,b的值:%d\n", b );

 

  return0;

}

当上面的代码被编译和执行时,产生下列结果:

交换前,a的值:100

交换前,b的值:200

交换后,a的值:100

交换后,b的值:200

实例中虽然在函数内改变了 a b的值,但是实际上 a b的值没有发生变化。


引用方式调用:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。

/* 函数定义 */
void swap(int *x, int *y)
{
   int temp;
   temp = *x;    /* 保存地址 x 的值 */
   *x = *y;      /*  y 赋值给 x */
   *y = temp;    /*  temp 赋值给 y */
  
   return;
}

通过引用传值来调用函数 swap()

#include <stdio.h>
 
/* 函数声明 */
void swap(int *x, int *y);
 
int main ()
{
   /* 局部变量定义 */
   int a = 100;
   int b = 200;
 
   printf("交换前,a 的值: %d\n", a );
   printf("交换前,b 的值: %d\n", b );
 
   /* 调用函数来交换值
    * &a 表示指向 a 的指针,即变量 a 的地址 
    * &b 表示指向 b 的指针,即变量 b 的地址 
   */
   swap(&a, &b);
 
   printf("交换后,a 的值: %d\n", a );
   printf("交换后,b 的值: %d\n", b );
 
   return 0;
}

当上面的代码被编译和执行时,产生下列结果:

交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100


    1. 补充:

1、根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。

1.1、内部函数

如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static,即

static 类型名 函数名 (形参表)

例如,函数的首行:

static int max(int a,intb)

内部函数又称静态函数。使用内部函数,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。

1.2、外部函数

如果在定义函数时,在函数的首部的最左端加关键字extern,则此函数是外部函数,可供其它文件调用。

如函数首部可以为

extern int max (int a,intb)

C语言规定,如果在定义函数时省略 extern,则默认为外部函数。

在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型来声明)。在对此函数作声明时,要加关键字 extern,表示该函数是在其他文件中定义的外部函数。

 

Eg

以下实例通过多个文件的函数实现输入一串字符串,然后删除指定的字符:

file1.c(文件1)

#include <stdio.h>
 
static void delete_string(char str[],char ch);
int main()
{
    extern void enter(char str[]); // 对函数的声明
    extern void print(char str[]); // 对函数的声明
    char c,str[100];
    enter(str);
    scanf("%c",&c);
    delete_string(str,c);
    print(str);
    return 0;
}
 
static void delete_string(char str[],char ch)//内部函数
{
    int i,j;
    for(i=j=0;str[i]!='\0';i++)
    if(str[i]!=ch)
    str[j++]=str[i];
    str[j]='\0';
}

file2.c(文件2)

#include <stdio.h>
 
void enter(char str[100]) // 定义外部函数 enter
{
    fgets(str, 100, stdin); // 向字符数组输入字符串
}

file3.c(文件3)

#include <stdio.h>
 
void print(char str[]) // 定义外部函数 print
{
    printf("%s\n",str);
}

输入字符串"abcdef",给字符数组 str,在输入要删去的字符'd'

运行结果:

$ gcc file1.c file2.c file3.c 
$ ./a.out
abcdef                   # 输入的字符串
d                        # 要删除的字符
abcef                    # 删除后的字符串


2、内联函数

内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。

内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数,对于小内存空间的函数非常受益。

使用内联函数的时候要注意:

1、递归函数不能定义为内联函数

2、内联函数一般适合于不存在whileswitch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。

3、内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。

4、对内联函数不能进行异常的接口声明。

 

示例:一个简单的交换函数

inline void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}
原创粉丝点击