整理自用 C 函式傳遞

2021-08-18 01:17:57 字數 1537 閱讀 6806

這個本來是沒什麼需要說明的,但是偏偏是錯了幾道題,發現自己思考不夠嚴謹。

函式傳遞,確實存在著值傳遞、址傳遞和引用傳遞三種。但是要搞清楚著通常是對於什麼變數而言的。

以下三個是所謂的值傳遞,值傳遞和引用傳遞最簡單的表達形式:

int

abs(int a);

intabs(int

*a);

intabs(int &a);

對於形如上述的表示式而言,無論是哪一種形式,a本身都是乙個區域性變數。都是在呼叫的時候為其創造了乙個臨時變數,當函式體結束之時,自動銷毀的。

也就是說,哪些僅針對a所做的改變,不論是哪一種傳遞方式,都終將會因為a的銷毀而灰飛煙滅。對於呼叫的函式而言不會產生任何的影響。

下面開始仔細說明:

值傳遞:呼叫函式只是把變數的值傳遞過來。所以a僅僅只是乙個和呼叫函式實參擁有相同大小的臨時變數。

引用傳遞:引用比較特殊。因為是實參的別名,所以可以簡單認為是呼叫實參來臨時旅遊

可能聽上去沒什麼用處,但是其實很重要。比如我們說址傳遞中,當形參改變時,會影響到實參。前提在於:因為臨時變數與原實參共享位址。因此,我通過臨時變數更改該位址內的數字,即使事後臨時變數消失了,但是原實參位址不變的,所以在同樣的位址內看到的東西,自然是已經生效了。

但是,a畢竟只是乙個臨時變數,如果我不通過臨時的東西去和生存週期更長的東西掛鉤,那麼我短暫做過的事情是不會被人看到的。

題目:下面程式輸出的**是多少?

void f(char * x)

int main()

分析:

1. str可以看做是字串陣列的首元素指標。字串陣列分配的空間在位址上是連續的;

2. 生成了乙個臨時性的指標變數x,但是它和str指向同乙個位址;

3. x++;使得x(內容)位址自增,從而使得它指向字串陣列第二個元素;

4. *x詞句修改了當前x指向位址內部的元素,即字串陣列第二個元素被改變。

5. 此時x變數離開了函式作用域,區域性變數被銷毀。

綜上可見,臨時變數x的一生只有一件事是和更長的生長週期掛鉤的,那就是修改了實參字串陣列第二個元素。其他只作用在x自身身上的一切行為都隨著x自身的消亡而湮滅了,在剩下的函式裡我們是見不到半點痕跡的。

因而,上述輸出str字串的結果應該是「hallo」。

題目:下面程式的輸出結果是:

#include 

#include

void fun ( double *pl,double *p2,double *s)

void *p = malloc( 100 );

sizeof ( p ) = ?

所以當利用sizeof的時候返回的將是int指標的記憶體位元組數,只能做這樣的函式了,void fun(int *a,size_t n);才能知道陣列大小。

整理自用 c 繼承 虛函式

一般的認為,虛機制發生在物件呼叫時,其實不然,只要能用到之時,他便會出現!在呼叫基類函式的時候,如果基類呼叫了乙個虛函式,同樣虛機制也會產生效果!不是基類的建構函式中!以下兩端 輸出結果完全不同,原因就在於 呼叫虛函式,只受當前物件的影響。即this指標。include using namespac...

整理自用 類 建構函式

類中方法的別稱 建構函式是一種特殊的類成員函式,當建立乙個類的物件時,它被呼叫來對類的資料成員進行初始化和分配記憶體。建構函式的命名必須和類名完全相同 題目 若pat是乙個類,則程式執行時,語句 pat ad 3 呼叫pat的建構函式的次數是 0 分析 pat ad 3 ad是個指向有著三個pat元...

整理自用 模板

2.類模板與模板類 知識點 1.函式模板呼叫時不需要顯式指定型別,系統自動匹配引數型別,若沒有合適的,會進行報錯。2.類模板使用需要顯式指定型別。3.返回值和引數的型別一致。將函式賦值給函式指標之時,尤其需要注意這個問題。4.函式模板是由編譯器根據呼叫型別例項化為可執行的函式。5.函式模版可以針對函...