c语言函数出入栈 c++出入栈

C语言 入栈顺序为什么函数入栈顺序从右往左

C语言函数参数入栈顺序从右到左是为了方便可变参数函数。

员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供网站制作、成都网站设计、微信公众号开发、电商网站开发,小程序制作,软件按需设计等一站式互联网企业服务。

一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。

在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。

二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。

三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。

四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。

用C语言实现入栈出栈

#include

stdio.h

int

stack[100];

/*100个栈空间*/

int*

sp

=

stack;

/*栈指针指向栈底*/

#define

push(

i

)

{

*sp++

=

i;

}

/*push一个数*/

#define

pop()

(*--sp)

/*pop一个数并返回*/

int

main()

{

int

i;

for

(

i

=

0;

i

10;

++i

)/*push

0~9*/

push(

i

);

for

(

i

=

0;

i

10;

++i

)/*输出9~0*/

printf(

"%d

",

pop()

)

;

}

C语言入栈出栈操作的程序,希望有人为我解答

您好:

你是在学习数据结构方面的知识吧。

首先呢,你学习栈,要了解栈的定义,明白它是怎么一回事,就是去理解他的思想。

最后才去用代码来体现出来。

栈是先进后出,其实是用代码控制的,

其实你要他先进先出也可以。

你只要明白他的原理就行。

代码,你可以理解为跟计算的一种对话的语言。

不用想的那么复杂。

就好比说话,你只要知道你要说什么就行(算法),而不用刻意明白要怎么说(语法)。

下面给我出我以前写的代码,关于栈的,顺序栈,其实还有链栈。

/*   数据结构-栈   */

/*   异常的细节处理还没弄好*/

#include iostream

#include stdlib.h

#include malloc.h

#define len_chu_shi 50   //初始空间大小

#define len_zeng_jia 10  //额外增加空间大小

#define OK 0       //正确

#define OVER -2     //

#define ERROR -1   //

using namespace std;

typedef int elem_type;          //元素类型

typedef int function_type;      //函数类型

typedef struct zhan

{

elem_type *top;    //栈顶

elem_type *base;   //栈底

int len;           //当前空间大小

}zhan;                //栈结构

function_type Init_zhan(zhan *exam);//初始化栈

function_type Get_top(zhan *exam,elem_type *e);//获取栈顶元素

function_type Add_top(zhan *exam,elem_type *e);//增加栈顶元素

function_type Delete_top(zhan *exam, elem_type *e);//删除栈顶元素

int main(int argc,char *argv[])

{

zhan *example = (zhan *)malloc(sizeof(zhan));

Init_zhan(example);

return OK;

}

function_type Init_zhan(zhan *exam)

{

exam-base = (elem_type *)malloc(len_chu_shi*sizeof(elem_type));

if(!exam-base)  //分配失败

exit(OVER);

exam-top = exam-base;

exam-len = len_chu_shi;

return OK;

}//--end

function_type Get_top(zhan *exam,elem_type *e)

{

if(!exam-base)

exit(OVER);

*e = *(exam-top - 1);  //不能用自减运算符,那样会改变栈顶指针的值

return OK;

}//--end

function_type Add_top(zhan *exam,elem_type *e)

{

if(exam-len = exam-top - exam-base)  //我个人觉得,如果 已经"",就已经数据溢出了,就应该报错

exam-base = (elem_type *)realloc(exam-base,(exam-len + len_zeng_jia)*sizeof(elem_type));

if(!exam-base)  //分配失败

exit(OVER);

*(exam-top++) = *e;   //应该是先改变栈顶指针的内容,然后栈顶指针再自增

exam-len += len_zeng_jia;

return OK;

}//--end

function_type Delete_top(zhan *exam, elem_type *e)

{

if(!exam-base)  //空栈

exit(OVER);

*e = *(--exam-top);  //应该是栈顶指针先自减,然后获取栈顶指针的内容

return OK;

}//--end


分享标题:c语言函数出入栈 c++出入栈
文章起源:http://scyanting.com/article/dosdheh.html