上一页 下一页

C 语言编程基础

函数参数使用指针

大多数 C 程序员首次使用指针是为了实现所谓的变量参数。您实际上已经在 scanf 函数中使用了变量参数——这就是为什么您必须在与 scanf 一起使用的变量上使用 &(地址运算符)。现在您理解了指针,您就能明白究竟发生了什么。

要理解变量参数的工作原理,让我们看看如何在 C 语言中实现一个交换函数。要实现一个交换函数,您希望做的是传入两个变量,让函数交换它们的值。下面是一种实现尝试——输入并执行以下代码,看看会发生什么

广告

#include <stdio.h>

void swap(int i, int j)
{
    int t;

    t=i;
    i=j;
    j=t;
}

void main()
{
    int a,b;

    a=5;
    b=10;
    printf("%d %d\n", a, b);
    swap(a,b);
    printf("%d %d\n", a, b);
}

当您执行此程序时,会发现没有发生交换。ab 的值被传递给 swap 函数,并且 swap 函数确实交换了它们,但是当函数返回时,什么也没有发生。

为了使此函数正常工作,您可以使用指针,如下所示

#include <stdio.h>

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

void main()
{
    int a,b;
    a=5;
    b=10;
    printf("%d %d\n",a,b);
    swap(&a,&b);
    printf("%d %d\n",a,b);
}

为了了解这段代码的作用,请将其打印出来,画出两个整数 ab,并在其中输入 5 和 10。现在画出两个指针 ij,以及整数 t。当调用 swap 函数时,会传递 ab地址。因此,i 指向 a(从 ia 画一个箭头),j 指向 b(从 bj 画另一个箭头)。一旦指针通过函数调用初始化,*i 就是 a 的另一个名称,*j 就是 b 的另一个名称。现在运行 swap 中的代码。当代码使用 *i*j 时,它实际上指的是 ab。当函数完成时,a 和 b 已经交换。

假设您在调用 swap 函数时不小心忘记了 &,并且 swap 行意外地看起来像这样:swap(a, b);。这会导致分段错误。当您省略 & 时,会传递 a而不是它的地址。因此,i 指向内存中的无效位置,并且当使用 *i 时系统崩溃。

这也是为什么 scanf 在您忘记在其传递的变量上使用 & 时会崩溃的原因。scanf 函数使用指针将读取的值放回您传入的变量中。如果没有 &scanf 将会收到一个错误的地址并崩溃。

变量参数是 C 语言中最常见的指针用法之一。现在您明白了!