C語言函數(shù)參數(shù)入棧順序從右到左是為了方便可變參數(shù)函數(shù)。
員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),小程序制作,軟件按需設(shè)計(jì)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
一、在函數(shù)調(diào)用時(shí),函數(shù)參數(shù)的傳遞,在C語言中是通過棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。
在調(diào)用函數(shù)時(shí),先根據(jù)調(diào)用函數(shù)使用的參數(shù),自右向左依次壓入棧中,然后調(diào)用函數(shù),在函數(shù)開始執(zhí)行時(shí),將參數(shù)再依次彈棧。根據(jù)棧數(shù)據(jù)結(jié)構(gòu)先進(jìn)后出的特點(diǎn),在函數(shù)中彈棧的順序就是從左向右的。
二、對于參數(shù)固定的函數(shù),無論是從左向右還是從右向左,都沒什么區(qū)別,最終都是所有參數(shù)全部傳遞。
三、對于可變參數(shù),比如printf,會(huì)在第一個(gè)參數(shù)格式字符串中,指明后續(xù)有幾個(gè)參數(shù),各自是什么類型的。于是在函數(shù)中,參數(shù)格式字符串必須第一個(gè)彈棧,否則無法獲取參數(shù)類型,也就無法獲知后續(xù)參數(shù)占幾個(gè)字節(jié),導(dǎo)致無法正確獲知參數(shù)。
四、理論上來說,如果從左向右壓棧,可變參數(shù)標(biāo)記格式字符串的參數(shù)放在最后,那么也是可以的。 不過最早設(shè)計(jì)C語言的人采用了這種方式,后續(xù)也就延續(xù)下來了。
#include
stdio.h
int
stack[100];
/*100個(gè)??臻g*/
int*
sp
=
stack;
/*棧指針指向棧底*/
#define
push(
i
)
{
*sp++
=
i;
}
/*push一個(gè)數(shù)*/
#define
pop()
(*--sp)
/*pop一個(gè)數(shù)并返回*/
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()
)
;
}
您好:
你是在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)方面的知識吧。
首先呢,你學(xué)習(xí)棧,要了解棧的定義,明白它是怎么一回事,就是去理解他的思想。
最后才去用代碼來體現(xiàn)出來。
棧是先進(jìn)后出,其實(shí)是用代碼控制的,
其實(shí)你要他先進(jìn)先出也可以。
你只要明白他的原理就行。
代碼,你可以理解為跟計(jì)算的一種對話的語言。
不用想的那么復(fù)雜。
就好比說話,你只要知道你要說什么就行(算法),而不用刻意明白要怎么說(語法)。
下面給我出我以前寫的代碼,關(guān)于棧的,順序棧,其實(shí)還有鏈棧。
/*???數(shù)據(jù)結(jié)構(gòu)-棧???*/
/*???異常的細(xì)節(jié)處理還沒弄好*/
#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;??????//函數(shù)類型
typedef?struct?zhan
{
elem_type?*top;????//棧頂
elem_type?*base;???//棧底
int?len;???????????//當(dāng)前空間大小
}zhan;????????????????//棧結(jié)構(gòu)
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);??//不能用自減運(yùn)算符,那樣會(huì)改變棧頂指針的值
return?OK;
}//--end
function_type?Add_top(zhan?*exam,elem_type?*e)
{
if(exam-len?=?exam-top?-?exam-base)??//我個(gè)人覺得,如果?已經(jīng)"",就已經(jīng)數(shù)據(jù)溢出了,就應(yīng)該報(bào)錯(cuò)
exam-base?=?(elem_type?*)realloc(exam-base,(exam-len?+?len_zeng_jia)*sizeof(elem_type));
if(!exam-base)??//分配失敗
exit(OVER);
*(exam-top++)?=?*e;???//應(yīng)該是先改變棧頂指針的內(nèi)容,然后棧頂指針再自增
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);??//應(yīng)該是棧頂指針先自減,然后獲取棧頂指針的內(nèi)容
return?OK;
}//--end