在呼叫乙個函式時進行引數傳遞(不只是講引數列表裡的引數,包括函式返回值的引數傳遞),其本質上進行的工作都是一樣的,即使用實參初始化形參。
實參與形參本質上是兩個完全不同的變數,它們之間並沒有更深入的聯絡,僅僅只是變數與初始值的關係而已。很普通的那種,大家都了解的差不多。
在此處需要強調一下,所謂傳值,其實是指在使用實參初始化形參時,將實參的值拷貝乙份到形參。此處我將傳指標也歸納到了傳值這邊,因為都有拷貝操作。但是此處需要稍微提一下,有幾種型別(也許還有其他?以後遇到會補充)是不能通過這種形式進行拷貝的(也就是不能進行真正意義上的傳值操作),那就是陣列與函式(還有io物件如cin、cout等)。所以當引數列表或者返回值型別中如果出現陣列名與函式名(只要引數型別不是引用),編譯器會自動將其轉換成常量指標型別,然後再使用這個常量指標進行傳值操作。例子(函式指標):
#include#includeusing std::string;
bool usebigger(const string &s1, const string &s2, bool (*pf)(const string &, const string &))
//細節:函式的型別只與函式的引數還有返回型別有關,與函式名無關
bool lengthcompare(const string &s1, const string &s2)
int main()
傳引用的方式也是使用實參初始化形參,但是它與傳值完全不同,它並沒有拷貝操作,而是利用引用的特點,將引用型別的形參繫結到實參上。從而達到可以直接操作實參的效果。c語言中不存在引用,所以需要使用指標來完成類似的操作。(多嘴一句,引用在編譯器底層其實是通過常量指標實現的)乙個經典的例子如下:
#includeusing namespace std;
void reset(int &i)
int main()
之所以有這第二種寫法,是因為前文中提到過,陣列是不能使用傳值操作的,所以傳遞陣列其實是將陣列名轉換成了指標,所以乙個指標的陣列其實在傳值操作時被轉換成了乙個指標的指標。並且一般情況下,第二種形式比較習慣一點,指標的指標。 C語言中的引數傳遞
問 你認為這個函式是在做什麼呀?答 好像是對引數 x,y的值對調吧?請往下看,我想利用這個函式來完成對a,b兩個變數值的對調,程式如下 void main 我問 exchg1 裡頭的 printf x d,y d n x,y 語句會輸出什麼啊?我再問 exchg1 後的 printf a d,b d...
C語言中給main函式傳遞引數!
相信大家用c語言定義main函式時,大多數人的寫法都是int main void 其實main函式是可以向其傳遞引數的,給個例項 給main函式傳參例項 include include int main int argc,char argv int main int argc,char argv i...
C語言中引數傳遞優化
我以前看了某位大大的分析,多引數函式呼叫會比單一引數更加花費cpu時間,因此使用結構體封裝引數。但是通過分析得到了自己的見解,關於這點是不能一概而論的。仔細檢視win32 api你就會發現,只是擁有眾多引數的時候才會使用結構體封裝,引數少的時候,不進行封裝的,因為你給結構體中的元素賦值也需要花費cp...