为什么出栈函数的形参要求是传入的是地址?可以这样定义吗int pop_stack(stack *s,int x)?谢谢。。。

//出栈操作
int pop_stack(stack *s,int *x)
{
if(s->top==-1)
return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}

不知楼主在C++区问VB是何意???
函数和C++大体相同,如果是自己写的函数就先需要定义函数,VB函数分二种,一种是有返回值的(function),另一种是没有返回值的(sub),后者也被称为"过程".
public关键词定义了函数是全局可访问的,private定义了函数只能由函数所在模块使用.即使在窗体模块中定义函数为public,那么在其他模块中也是不能访问的.
VB函数定义和C++的区别一在于:VB靠public/private决定函数访问权限,而C++是如果函数原形不在调用源文件(cpp文件)中或被调用函数位置位于调用函数的后面,那么只需要在调用源文件中声明函数原型即可,或者将函数原型写到头文件中,然后在调用源文件中引用这个头文件即能对任意一个函数进行访问.

区别二:C++的函数原型是指完整的函数定义,包含返回类型 函数名 ([参数列表]),只要将返回类型声明成void时才不需要(也不能有return语句).C++的函数声明只需要写出与原形相同的结构,但不需要写实现具体形为的语句即{}内的内容不需要写.
而VB中,一个模块中某个函数(或过程)调用另一个模块中的函数(或过程),那么被调用的函数声明时必须是public关键词定义的.如果是同一模块中的函数,那么不管是public还是private定义的或者两者的上下位置,都可以访问,且不需要写函数声明.

区别三,参数传递问题,VB是实参,即调用者传某个参数给被调用函数,那么被调用的函数有权修改传递的参数.在C++中是形参,即调用者传某个参数给被调用者时,函数入堆,参数副本(即参数的copy)入栈,函数返回则函数出堆,栈中数据随函数出堆而出栈(虽然并没有被重置为0或空,但已经失去作用了).函数返回一个值(除非原型指定了void则没有返回值)栈中的数据不会影响到调用这个函数时传递的参数.那么也就是说C++的函数只能有一个返回值.不要失望,这是通常情况下,如果真的有需要调用函数后返回多个值是可以的,因为C++提供了指针和引用二种方式.指针和引用解释起来就跑题了,呵呵,楼主如果是新手就去查查相关的资料,如果是老手,当我没说,囧...简单点说指针和引用在函数参数上都是指向调用者所传递的参数的实体(不是副本).通过这二种方法,可以做到函数多值返回.

C++搞这么麻烦是为什么?答曰:数据保护机制.可以最大程度上保护数据,防止随意修改参数后再将其返回,对此可能引起的代码错误是很难查出来的(只有不断的调试才会发现),也正是基于数据保护机制,通常C++的变量会要求尽可能的少使用全局变量.
而VB根本没有这种保护机制.

区别四:Windows API函数调用.
VB中,需要在模块头部(即任何一个函数或过程前)声明被调用的API函数.格式如下:
declare function(或sub) 函数名(或过程名) lib "库文件名(即DLL文件名)" alias 函数别名([参数名 as 参数类型],...)as 函数返回值类型(sub无返回值)
过程如:
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
函数如:
Declare Function CopyIcon Lib "user32" Alias "CopyIcon" (ByVal hIcon As Long) As Long
declare前指定为public时全局(工程中任意一个模块中)可访问,private则是当前模块可访问.(窗体模块中不能定义为public)

C++调用windows api,都是引用头文件windows.h来一次性对所有可能用到的api函数和常数进行声明(= =...还是头文件好啊....)

VB调用API时默认是按地址传递,即byref 参数名 as 参数类型.当我们想传递具体的值时将byref改为byval即可,意为按值传递.所谓按地址即指,即调用者传递参数时传递的是这个参数在内存中的地址.而按值传递则是读取这个参数的值再传递给被调用者.
C++则全是按值传递(不使用指针和引用时都是形参,即是形参自然是取值了)
按地址传递还是按值传递按实际需要修改.需要说明的是VB中按址传递时需要明确知道被调用函数是否支持按地传递,否则产生的错误可能使函数返回错误的值,也可能是致命错误而引起程序崩溃,系统死机等等(比如xxx.exe遇到问题需要关闭,我们对此产生不便表示歉意...囧...)

区别五.对于vb,过程(Sub)可以直接在单独的行上写上过程名即可,或者 call 过程名.C++中,即使函数不接受参数,调用时也要加上(),在单独的行上写上函数名 后面跟一对().

想到的就这么多了...不知是不是楼主想知道的?
你的串号我已经记下,采纳后我会帮你制作
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-29
不可以,因为函数调用传入的是值,既然出栈,肯定要有一个变量来接收这个值,int *x ,就是表示这个变量的地址,所以可以直接改变x的值,如果你传入x,那么这个x会是一个临时变量,而不是你要接收出栈值的变量,例如:
int main()
{
int a=1,b =2;stack s;
push(*s,b);
pop(*s,a);
return 0
}
那么a 的值不会变,也就达不到出栈效果,如果非要用int x传入,那么只有靠返回值来改变x的值,即 a = pop(*s,a);如果这样,传入的a就是多余的!
楼主能明白吗?
第2个回答  2010-11-28
int pop_stack(stack *s,int x)
{
if(s->top==-1)
return 0;
else
{
*x=s->data[s->top];
s->top--;
return x;//返回出栈的值,如果是指针就不用,
}
}本回答被网友采纳
第3个回答  2010-11-29
1+1=2
相似回答