objective c 函式引數 傳位址 傳指標

2021-07-13 20:34:42 字數 2505 閱讀 3999

原文: 

首先說明一下題目中的形如部分(nserror *__autoreleasing *),這部分可能剛開始看有點兒理解不了,其實就是這樣的(nserror  **),這就表示乙個指向指標的指標,__autoreleasing是乙個修飾符,表示傳入的是乙個通過autorelease方法返回的id物件,這在記憶體管理中用到的。

我們都知道這樣乙個問題,將乙個基本資料型別的變數通過函式引數傳入函式內,在函式內如何改變,都不會影響到外部變數的值!如下**:

#import

voidtest(inta)

intmain(intargc,constchar* argv)

return0;

}

程式執行結果如下:

基本變數傳入函式執行結果

a的值還是等於5,說明函式傳遞的只是乙個5的值。那如果要在函式內部改變外部變數的值要怎麼辦呢?當然是用指標了,將指標的值傳入函式,然後在函式中根據指標去找到指向的記憶體中修改,**如下:

#import

voidtest(int* a)

intmain(intargc,constchar* argv)

return0;

}

再看看執行結果:

基本資料型別指標傳入函式結果

這時a的值是10了,我們傳入的是記憶體位址,然後在函式中對位址指向記憶體進行修改。

那麼,如果函式引數本身是乙個物件,我們傳入的是乙個物件,本身就是乙個位址,會怎樣呢?我們先新建乙個物件myobject,然後有乙個nsstring型別的name屬性,這個**我就不貼出來了,直接看main.m的**吧! 

#import

#import "myobject.h"

voidtest(myobject * obj)

intmain(intargc,constchar* argv)

return0;

}

看看程式執行結果

物件指標傳入函式的結果

怎麼樣,輸出結果是xcoder studio,而不是web site。因為我們傳入函式的是obj這個指標,這個指標指向了記憶體中的乙個myobject物件,函式中obj.name改變的是這個物件的屬性,當函式中obj = [[myobject alloc] init];執行後,系統會在記憶體中新開闢一塊兒儲存空間儲存乙個新的myobject物件,然後將函式中的obj儲存的指標值改為這個新的記憶體位址,而函式外的obj指標並沒有改變,還是指向原來的這個物件的位址。

那麼我們如何實現在函式中改變函式外物件呢?就用乙個新的指標指向這個物件的指標,也就是我們說的指向指標的指標。**如下:

#import

#import "myobject.h"

voidtest(myobject ** obj)

intmain(intargc,constchar* argv)

return0;

}

執行結果如下:

指向指標的指標傳入函式引數的結果

這時候就實現了吧!

標題中所說的nserror *__autoreleasing *都是這樣的,我們可以在外面新建乙個nserror,當函式執行中有錯誤時,新建乙個nserror物件並儲存到我們新建的這個nserror物件中。我們就可以通過這個nserror是否為nil看函式執行是否出錯!

函式傳引數 python 函式引數

1.位置引數 最熟悉的一種引數形式,優點 簡單。缺點 傳遞引數不夠靈活 2.預設引數 優點 提高了 的復用性 缺點 容易產生二義性 注意事項 一是必選引數在前,預設引數在後。二是如何設定預設引數。當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。def p...

js 函式引數傳值 傳引用

基本數值型別 傳值 引用型別 嚴格來說不能算傳引用,在js中叫按共享傳遞 call by sharing也叫按物件傳遞 按物件共享傳遞。該策略的重點是 呼叫函式傳參時,函式接受物件實參引用的副本 既不是按值傳遞的物件副本,也不是按引用傳遞的隱式引用 它和按引用傳遞的不同在於 在共享傳遞中對函式形參的...

objective c 可變引數

容易發現cocoa foundation 中提供了一些可變引數的方法,如 nslog nsstring format,在實際的程式設計實踐中,我們也需要自己實現可變引數的方法。在objc中,是依靠原生c庫來的實現的。請看示例 1 void dolog nsstring formatstr,2223 ...