C Primer Plus (第五版)中文版——第 9 章 函数

9.1  函数描述

  • 函数(function)是用于完成特定任务的程序代码的自包含单元。一个简单函数:
/* lesser.c -- finds the lesser of two evils */
#include <stdio.h>
int imin(int n,int m);  /* prototype the function */

int main(void)
{
    int evil1, evil2;

    printf("Enter a pair of integers (q to quit):\n");
    while (scanf("%d %d", &evil1, &evil2) == 2)
    {
        printf("The lesser of %d and %d is %d.\n",
            evil1, evil2, imin(evil1,evil2));    /* use the function */
        printf("Enter a pair of integers (q to quit):\n");
    }
    printf("Bye.\n");
  
    return 0;
}

int imin(int n,int m)
{
    int min;

    if (n < m)
        min = n;
    else
        min = m;
  
    return min;
}

程序分析:imin 标识符在不同位置出现了三次:

  • 函数原型(function prototype)告知编译器 imin() 的函数类型。
  • 函数调用(function call)导致 imin() 函数的执行。
  • 函数定义(function definition)确切指定 imin() 函数的具体功能。

一、原型声明

  • 使用函数前需要用 ANSI 原型声明该函数。函数原型声明返回值类型、参数个数及各参数的类型。
int imin(int n,int m);   /* prototype the function */
/* 使用逗号分隔的类型列表指明参数的个数和类型 */

int imin(int, int);      /* prototype the function */
/* 可以根据个人喜好省略变量名 */

二、函数调用

  • 函数调用导致该函数的执行:
imin(evil1,evil2);   /* use the function */
  • evil1 和 evil2 被称为实际参数。实际参数可以是常量、变量或表达式。

三、函数定义

  • 函数定义以 ANSI C 函数头开始,且ANSI C 要求在每个变量前声明其类型:
int imin(int n,int m)
  • 变量 n 和 m 被称为形式参量。形式参量是局部变量,与其他函数中的变量(即使同名)相互独立、互不影响。

四、使用 return 从函数中返回一个值

  • 在一个具有返回值的函数中,关键字 return 指明了其后的表达式即是该函数的返回值。
  • return 语句的另一作用是终止执行函数,并把控制返回给调用函数的下一语句,即使 return 语句不是函数的最后一个语句。
  • 许多 C 程序员更倾向于只在函数结尾使用一次 return 语句。

9.3  递归

C 允许一个函数调用其本身。这种调用过程被称作递归(recursion)。

  • 优点:在某些编程问题上,递归提供了最简单的解决方法。
  • 缺点:一些递归算法会很快耗尽计算机的内存资源;递归的程序难于阅读和维护。

9.4  多源代码文件程序的编译

  • 在 Windows 系统下的编译器是面向工程的。工程(project)描述了一个特定的程序所使用的资源。这些资源包括源代码文件。使用这种编译器运行单文件程序时,必须创建工程。而对于多文件程序,需要将源代码文件加入到一个工程之中,且工程必须包括所有的源代码文件(.c 文件),但头文件(.h 文件)不能包含在工程之中。因为工程只管理所使用的源代码文件,而使用哪些头文件需要由源代码文件中的 #include 指令确定。
  • 把函数原型和常量定义放在一个头文件中是一个和好的变成习惯。

9.5  地址运算符:&

  • 一元地址运算符 & 可以取得变量的存储地址。变量的地址可以看作是该变量在内存中的位置。
/* 假设 pooh 是一个变量名,那么 &pooh 就是该变量的地址. */
/* 假定 pooh 赋值为24,pooh 的存储地址是0B76,那么语句: */
pooh = 24;
printf("%d %p", pooh, &pooh);
/* 将输出如下数值(%p 是输出地址的说明符):            */
24 0B76

9.7  指针简介

  • 指针是一个其数值为地址的变量(更一般地说是一个数据对象)。
  • 普通的变量把它的数值作为基本数值量,而通过使用地址运算符&将它的地址作为间接数值量。
  • 对指针来说,它把地址作为基本数值量,而通过使用间接运算符*将地址中存储的数值作为间接数值量。
/* 若某个指针变量名为ptr */
ptr = & pooh;    /* 把pooh的地址赋给ptr,注意&pooh是一个常量,而ptr是一个变量 */
  • 间接运算符:*
/* 若某个指针变量名为ptr */
ptr = & pooh;    /* 把pooh的地址赋给ptr,注意&pooh是一个常量,而ptr是一个变量 */
val = * ptr;     /* 使用间接运算符*来获取pooh中存放的数值 */
  • 指针声明
int * pi;    /* 类型标识符表明了被指向变量的类型,星号(*)表明变量pi为一指针 */
  • 使用指针在函数间通信:使用函数交换 x 和 y 的值。
/* swap3.c -- using pointers to make swapping work */
#include <stdio.h>
void interchange(int * u, int * v);

int main(void)
{
    int x = 5, y = 10;

    printf("Originally x = %d and y = %d.\n", x, y);
    interchange(&x, &y);  /* send addresses to function  */
    printf("Now x = %d and y = %d.\n", x, y);

    return 0;
}

void interchange(int * u, int * v)    /* u的值为&x,*u代表x的值 */
{
    int temp;

    temp = *u;       /* temp gets value that u points to */
    *u = *v;
    *v = temp;
}

猜你喜欢

转载自blog.csdn.net/Mr__Gold/article/details/84139582