函数参数使用指针
大多数 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); }
当您执行此程序时,会发现没有发生交换。a 和 b 的值被传递给 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); }
为了了解这段代码的作用,请将其打印出来,画出两个整数 a 和 b,并在其中输入 5 和 10。现在画出两个指针 i 和 j,以及整数 t。当调用 swap 函数时,会传递 a 和 b 的地址。因此,i 指向 a(从 i 到 a 画一个箭头),j 指向 b(从 b 到 j 画另一个箭头)。一旦指针通过函数调用初始化,*i 就是 a 的另一个名称,*j 就是 b 的另一个名称。现在运行 swap 中的代码。当代码使用 *i 和 *j 时,它实际上指的是 a 和 b。当函数完成时,a 和 b 已经交换。
假设您在调用 swap 函数时不小心忘记了 &,并且 swap 行意外地看起来像这样:swap(a, b);。这会导致分段错误。当您省略 & 时,会传递 a 的值而不是它的地址。因此,i 指向内存中的无效位置,并且当使用 *i 时系统崩溃。
这也是为什么 scanf 在您忘记在其传递的变量上使用 & 时会崩溃的原因。scanf 函数使用指针将读取的值放回您传入的变量中。如果没有 &,scanf 将会收到一个错误的地址并崩溃。
变量参数是 C 语言中最常见的指针用法之一。现在您明白了!