user-0 提问: 关于栈的初始化和SqStack *&s

回复:
user: user-1
content: 引用 10 楼 SXJIAKE 的回复:// C++ 引用方式： void InitStack(SqStack *&refps) { 	refps = (SqStack *)malloc(sizeof(SqStack)); 	refps->top =- 1; } // 调用方式： SqStack *ps; InitStack(ps);   // C 二级指针方式： void InitStack(SqStack **lpps) { 	if (lpps != NULL) 	{ 		(*lpps) = (SqStack *)malloc(sizeof(SqStack)); 		(*lpps)->top =- 1; 	} } // 调用方式： SqStack *ps; InitStack(&ps);   // C 一级指针方式： SqStack *InitStack(void) { 	SqStack *ps = (SqStack *)malloc(sizeof(SqStack)); 	if (ps != NULL) 	{ 		ps->top = -1; 	} 	return ps; } // 调用方式： SqStack *ps; ps = InitStack();   refps = (SqStack *)malloc(sizeof(SqStack));这里的代表着什么意思

user: user-0
content: 引用 10 楼 SXJIAKE 的回复:// C++ 引用方式： void InitStack(SqStack *&refps) { 	refps = (SqStack *)malloc(sizeof(SqStack)); 	refps->top =- 1; } // 调用方式： SqStack *ps; InitStack(ps);   // C 二级指针方式： void InitStack(SqStack **lpps) { 	if (lpps != NULL) 	{ 		(*lpps) = (SqStack *)malloc(sizeof(SqStack)); 		(*lpps)->top =- 1; 	} } // 调用方式： SqStack *ps; InitStack(&ps);   // C 一级指针方式： SqStack *InitStack(void) { 	SqStack *ps = (SqStack *)malloc(sizeof(SqStack)); 	if (ps != NULL) 	{ 		ps->top = -1; 	} 	return ps; } // 调用方式： SqStack *ps; ps = InitStack();谢谢，已经搞懂了

user: user-2
content: // C++ 引用方式： void InitStack(SqStack *&refps) { 	refps = (SqStack *)malloc(sizeof(SqStack)); 	refps->top =- 1; } // 调用方式： SqStack *ps; InitStack(ps);   // C 二级指针方式： void InitStack(SqStack **lpps) { 	if (lpps != NULL) 	{ 		(*lpps) = (SqStack *)malloc(sizeof(SqStack)); 		(*lpps)->top =- 1; 	} } // 调用方式： SqStack *ps; InitStack(&ps);   // C 一级指针方式： SqStack *InitStack(void) { 	SqStack *ps = (SqStack *)malloc(sizeof(SqStack)); 	if (ps != NULL) 	{ 		ps->top = -1; 	} 	return ps; } // 调用方式： SqStack *ps; ps = InitStack();

user: user-2
content: C++ 引用方式： void InitStack(SqStack *&refps) { 	refps = (SqStack *)malloc(sizeof(SqStack)); 	refps->top =- 1; }  C 二级指针方式： void InitStack(SqStack **lpps) { 	if (lpps != NULL) 	{ 		(*lpps) = (SqStack *)malloc(sizeof(SqStack)); 		(*lpps)->top =- 1; 	} }  C 一级指针方式： SqStack *InitStack(void) { 	SqStack *ps = (SqStack *)malloc(sizeof(SqStack)); 	if (ps != NULL) 	{ 		ps->top = -1; 	} 	return ps; }就是不能用你的那种方式，因为你没法返回你申请的内存。

user: user-3
content: 不用引用的话只是你函数中的参数指向了申请的内存，而这个参数只是一个复制后的指针，而不是你调用的那个

user: user-4
content: void InitStack(SqStack *&s) {     s=(SqStack *)malloc(sizeof(SqStack));     s->top=-1; }  这个是C++的feature吧，C语言考虑使用二级指针 void InitStack(SqStack **s) {     *s=(SqStack *)malloc(sizeof(SqStack));     (*s)->top=-1; }

user: user-5
content: void InitStack(SqStack *&s)里的&是引用传参，不是取址 如果是void InitStack(SqStack *s)，那么久不能通过InitStack函数修改实参的指向 要在函数里修改指针的指向，必须传一级指针的引用或者二级指针才行 仅仅传一级指针只能修改指针所指向的区域的值（因为实参和形参是两个不同的指针，他们仅仅只是指向了同一块内存而已）

user: user-4
content: 引用 6 楼 qq423399099 的回复:你不用二级指针的话，可以通过带返回值的InitStack函数（在InitStack函数里return malloc出来的指针），这样的话一级指针足矣。 引用 5 楼 yj7758423 的回复:[quote=引用 2 楼 yangyijk 的回复:] void InitStack(SqStack *&s) {     s=(SqStack *)malloc(sizeof(SqStack));     s->top=-1; }  这个是C++的feature吧，C语言考虑使用二级指针 void InitStack(SqStack **s) {     *s=(SqStack *)malloc(sizeof(SqStack));     (*s)->top=-1; } 那么我想要用C初始化一个顺序栈，必须用二级指针吗？[/quote] 如@qq423399099所说也可以，那样就不用传递参数。又或者全局指针也可以。

user: user-5
content: 你不用二级指针的话，可以通过带返回值的InitStack函数（在InitStack函数里return malloc出来的指针），这样的话一级指针足矣。

user: user-0
content: 引用 2 楼 yangyijk 的回复:void InitStack(SqStack *&s) {     s=(SqStack *)malloc(sizeof(SqStack));     s->top=-1; }  这个是C++的feature吧，C语言考虑使用二级指针 void InitStack(SqStack **s) {     *s=(SqStack *)malloc(sizeof(SqStack));     (*s)->top=-1; } 那么我想要用C初始化一个顺序栈，必须用二级指针吗？

user: user-6
content: 引用 1 楼 qq423399099 的回复:void InitStack(SqStack *&s)里的&是引用传参，不是取址 如果是void InitStack(SqStack *s)，那么久不能通过InitStack函数修改实参的指向 要在函数里修改指针的指向，必须传一级指针的引用或者二级指针才行 仅仅传一级指针只能修改指针所指向的区域的值（因为实参和形参是两个不同的指针，他们仅仅只是指向了同一块内存而已） 我觉得其实没必要弄个指针的引用吧，接口只一个指针void InitStack(SqStack *s)或者只一个引用void InitStack(Sqstack &s)都行，这里的SqStack只是一个收纳箱，里面的top和base指针才有可能要改实参的指向吧。 这几天我也在啃数据结构，严蔚敏的书上就是只用引用的。。

user: user-3
content: SqStack *&s 传入的是一个指针的引用，也就是函数中的参数用的是调用时的参数，而SqStack *s函数中的参数只是一个复制品，你修改不会影响到调用的参数