尼古丁戒断反应:void InitStack( SqStack *&S)

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 03:38:21
为什么这个S形参前面用了* 和&呢?是怎么个用法,含义如何呀?
小弟在这先谢了,那位高手帮一下?
这个写法是我从《数据结构上机试验》的书上抄下来的,且可以运行,但就是不知道是什么个用法!

这样的表示确实是有的,我来详细介绍一下.
其中,&表示引用,而*表示指针.
我们来看一下,如果你的参数写成 void initstack(sqstack *s)
这是什么意思呢,想必都知道,就是把main()函数中的一个定义的指针赋值给指针s,这就说到了对于函数参数传递的问题,函数的参数传递分为引用和非引用
那么它们的区别是什么呢?举个例子
#include<iostream>
using namespace std;
void initstack1(int *s){ *s=8 ;}
void initstack2(int &*s){ *s=8;}
//这两个函数分为函数1和函数2来表示,另外sqstack是数据结构中的类C语言,在编译中是会报错的,我们换一个数据类型

int main(){
int a=1,b=1;
int *p1=&a,*p2=&b;//不好意思第一次搞错了
initstack1(p1);
cout<<*p1; //结果是输出1
initstack2(p2);
cout<<*p2; //结果是输出8
}
引用(加&)和非引用(不加&)为什么结果不一样呢,都是赋值的函数呀
这就是函数作用域和生命期的原因
不加引用是把实参复制一份给形参,形参的变化不影响实参,
而非引用是直接对实参进行操作,也就是赋予了函数2异地操作数据的能力
这就是输出结果不同的原因,另外这个函数是一个顺序栈,数据结构中的数据
类型是用类C语言描述的,和编程语言是不一样的,它的目的就是为了说明算法
当然,我们理解了算法,才能更好的进行编程.
QQ:547758555

应该没有*吧,就是SqStack &S,表示引用传递。

原来楼主是从上机试验上抄的代码啊,我还以为是教材上讲栈的时候给的三元组表示里面的伪码呢,如果是伪码的话,应该就是只有一个&S,因为伪码不牵涉到实现细节,不会指出传递栈的时候要用指针。

实际代码中用*,&的原因是:栈结构包含数据量比较大,作为参数传递的话,太浪费空间,所以要传递其指针;InitStack这样的函数,会修改S的值,即调用前可能S是NULL,调用后S肯定要指向一个空栈,即S的值发生了改变,所以要用引用传递,要加&。如果是Pop,Push可能就不用加&了。

真不知道楼上的朋友有没有在编绎器里调过这两个函数?
int *p1 = 1, *p2 = 1;
有给指针初始化数值的吗?
真不知道“cout<<*p1;//结果是输出1”是怎么得来的 -_-!!
-----------------------------------------------------
楼主说的void InitStack( SqStack * &S)
我想唯一的解释就是,想把S声明成“指针的别名”.
在调用的时候,可以用下方法:
Stack sk;//声明一个Stack对象sk
Stack * p = &sk;//声明一个指向sk对象的指针p
Stack * &rp = p; //声明一个sk对象的指针的别名rp
在使用rp时,感觉和使用p是一样的。都可以直接对对象sk进行操作.
------------------------------------------------------
关于别名的概念,相信楼主要学习C++的时候,已经是非常了解了!

你仔细看一下书本上是否真的这样写,这样是错误的!
&是一个运算符,不是一个用来定义数据类型 的标识符!
你这个应该是数据结构中栈的初始化函数吧,学习数据结构时不要区于形式,而在于含意,数据结构是一门比较抽象的知识,也是编程的基础,太区于形式化,就不能真正理解到程序的意思!