指针作为函数参数
大多数C程序员开始使用指针时是用它们实现函数的参数,所谓可变参数。为了理解可变参数是如何工作的,我们看看在C语言中如何执行一个交换函数。要执行一个交换函数,您要做的是引入两个变量,让函数交换它们的值。这里是一个执行交换函数的试验——输入并执行以下代码,看看会发生什么:
#include
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 %dn", a, b);swap(a,b);printf("%d %d n", a, b);}
执行程序后您会发现变量并没有被交换。a和b的值是传入了swap,而且交换函数确实交换了它们。但是函数返回后实际上没有产生任何效果。 要使函数正确工作您可以使用指针,如下所示:
#include
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 %dn",a,b);swap(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(a,b);。这会导致段错误。当您忘记使用&的时候,引入的便是a的值,而不是a的地址。因此,i指向了内存中一个无效的地址,当使用*i的时候系统就会崩溃。
因为同样的原因,如果您在引入的变量中忘记了&,scanf函数也会崩溃。scanf函数使用指针将它读取的值,返回给您引入的变量。没有了&,scanf就引入了一个错误的地址,并导致崩溃。
可变参数是C语言指针最普通的用法之一。