亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您好,請問為什么出棧函數的形參要求是傳入的是地址?

您好,請問為什么出棧函數的形參要求是傳入的是地址?

牛魔王的故事 2021-12-16 19:10:36
//出棧操作int pop_stack(stack *s,int *x){if(s->top==-1)return 0;else{*x=s->data[s->top];s->top--;return 1;}}
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

函數和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++中,即使函數不接受參數,調用時也要加上(),在單獨的行上寫上函數名 后面跟一對().




查看完整回答
反對 回復 2021-12-19
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

不可以,因為函數調用傳入的是值,既然出棧,肯定要有一個變量來接收這個值,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就是多余的!


查看完整回答
反對 回復 2021-12-19
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

int pop_stack(stack *s,int x)
{
if(s->top==-1)
return 0;
else
{
*x=s->data[s->top];
s->top--;
return x;//返回出棧的值,如果是指針就不用,
}
}



查看完整回答
反對 回復 2021-12-19
  • 3 回答
  • 0 關注
  • 394 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號