iOS函數(shù)的參數(shù)傳遞機制

站在巨人的肩膀上展望遠方!
感謝:李剛老師的瘋狂iOS講義?。。?/p>

兩個概念:

形參:在聲明函數(shù)時使用的參數(shù)
實參:在調(diào)用函數(shù)時傳入的參數(shù)

一個本質(zhì):

OC函數(shù)的參數(shù)傳遞的本質(zhì)就是:值傳遞

值傳遞:將實參值的副本(復(fù)制品)傳入函數(shù)內(nèi),而實參本質(zhì)不會收到任何影響。

舉個栗子:

void swap(int a,int b){
     int temp = a;
     a = b;
     b = temp;
     NSLog(@"swap---%d,%d",a,b);
}
int main(int argc, const char * argv[]) {
     @autoreleasepool {
          int a = 1;
          int b = 2;
          swap(a,b);//這里的a,b就是實參
          NSLog(@"swap后---%d,%d",a,b);
     }
     return 0;
}

運行結(jié)果:

swap---2,1
swap后---1,2

原因:

當系統(tǒng)開始執(zhí)行函數(shù)時,系統(tǒng)為形參執(zhí)行初始化,就是把實參的值賦給函數(shù)的形參,函數(shù)里操作的并不是實際的實參值。

說人話:就是swap中的a,b只是main函數(shù)中a,b的復(fù)制品!當swap調(diào)用a,b時,是將main函數(shù)中的a,b的值復(fù)制進自己函數(shù)中給自己的a,b,所以改變時只會改變自己函數(shù)中的a,b。
來來來,我們把這顆栗子在加工一下:

@interface Person : NSObject
@property int a;
@property int b;
@end
#import <Foundation/Foundation.h>
#import "Person.h"

void swap(Person *p){//a,b就是形參
     int temp = p.a;
     p.a = p.b;
     p.b = temp;
     NSLog(@"swap---%d,%d",p.a,p.b);
}

int main(int argc, const char * argv[]) {
     @autoreleasepool {
          Person *p = [Person new];
          p.a = 1;
          p.b = 2;
          swap(p);//這里的a,b就是實參
          NSLog(@"swap后---%d,%d",p.a,p.b);
     }
     return 0;
}

運行打?。?/p>

swap---2,1
swap后---2,1

哎哎哎,不是值復(fù)制嗎?為什么swap后p的值也變了呢???
這里就牽涉到一個概念:指針對象!p是什么?是Person類的實例化變量,它在main函數(shù)中儲存的是一個指針地址,這個地址指向的是Person對象!而當p作為實參傳給swap時,依然是值復(fù)制,只不過復(fù)制的是p的指針地址!意味著swap中的形參p也是一個指向Person的地址而已,所以再swap操作p,就是直接操作Person本身?。。。?br> 但是!但是!但是!swap中的p與main函數(shù)中的p是兩個變量!不信的話你可以在swap中NSLog后添加一個p = nil;看看mian函數(shù)中調(diào)用swap后p會不會變空。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,014評論 0 2
  • C語言是面向過程的,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個結(jié)構(gòu)化語言,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)。C程...
    小辰帶你看世界閱讀 760評論 0 1
  • 使用蒙板可以讓我們只關(guān)注感興趣的圖像部分。掩碼的關(guān)鍵點是它們允許我們將計算的重點僅限于感興趣的圖像區(qū)域. 現(xiàn)實不似...
    HaveyYeung閱讀 5,130評論 0 2
  • 每個人都會在自己最美好的年華里遇見那個一輩子都不會忘記的人,卻在無能為力和年少輕狂的情況下徹底失去,這似乎已經(jīng)成為...
    容故閱讀 378評論 0 0
  • 我感覺現(xiàn)在這個社會對我們的誘惑太大了,整天與手機相伴,除了睡覺,時時刻刻在關(guān)注著手機,是它魅力太大還是我們不夠堅定...
    EncounterU閱讀 275評論 0 0

友情鏈接更多精彩內(nèi)容