技术中心
 
 

指针作为函数参数

   日期:2009-07-29     来源:互联网    

指针作为函数参数

大多数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 %d
n", a, b);swap(a,b);printf("%d %dn", 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 %d
n",a,b);swap(printf("%d %dn",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语言指针最普通的用法之一。

 
  
  
  
  
 
更多>同类技术
 
全年征稿 / 资讯合作
 
推荐图文
推荐技术
可能喜欢