数据结构算法经常看到的形如"int InitStack(Stack &S)"和"int Empty(Stack S)"的解释

   本文由江伟原创,如要转载请注明出处,谢谢!

  

  在很多算法中我们经常看到形如"int InitStack(Stack &S)"和"int Empty(Stack S)"的两种形式,即有"&"和没有"&"两种。相信很多人还没弄清楚这是怎么回事。其实这是函数传参的两种形式—按值传递按址传递

  

  我们都知道以前学c++时一个经典例子用来解释这两种传参方式的区别,就是调换两个变量a和b的值的swap函数。当函数是"swap(a,b)"时,调用该函数后,函数操作的其实只是a和b的副本(按值传递会先建立参数的拷贝),a和b的值其实并没变,当用swap(&a,&b)时,因为调用该函数时操作的是地所指的那块内存区域,函数调用结束后a和b当然也变了。同理,"int InitStack(Stack &S)"是初始化栈,S被改变了,要返回到主函数中,所以要用按址传递;而"int Empty(Stack S)"只是判断S是否为空,并没改变S的内容,所以不用按址传递。


  因此,在数据结构的那些函数中有的有"&",有的没"&",也就不奇怪了。

  还有,有的函数传递参数可以按值传递,但是由于要先建立参数的拷贝,这样会耗费时间和空间等资源,所以用按址传递更好。除了用取地址符&,也可以用指针的方式也就是"int InitStack(Stack *S)"。


  最后,比如初始化栈这个函数如果不用"InitStack(Stack &S)",而用"InitStack(Stack S)"也行,只不过函数体最后要加上"return S;",并且将函数返回值类型改为"Stack",即"Stack InitStack(Stack S)",但是如果遇到"int Pop(Stack &S,SElemType &e)"这样要返回两个值的,不好用这种方法了。而且感觉这样有点多此一举。。。。。

你可能感兴趣的:(数据结构,c,算法)