2012-08-02 100 views
0

我正在讀一本書來學習Objective-C,並且這個程序假設顯示處理指針的關鍵概念,而且我真的迷失了方向。傳遞指向函數的困惑

是否有某種轉換在轉p1p2&il,並&i2的指針的值(*)函數的參數發生的?像p1變成*p1

我以爲變量的副本被傳入函數而不是實際的變量,那麼爲什麼傳入的變量的值在函數後發生了變化?

此外,爲什麼我會在第三行顯示警告:No previous prototype for function 'exchangeValues'

謝謝!

#import <Foundation/Foundation.h> 

void exchangeValues (int *pint1, int *pint2) { 
    int temp; 

    temp = *pint1; 
    *pint1 = *pint2; 
    *pint2 = temp; 
} 

int main (int argc, char *argv[]) { 
    @autoreleasepool { 
     void exchangeValues (int *pint1, int *pint2); 
     int il = -5, i2 = 66, *p1 = &il, *p2 = &i2; 

     NSLog(@"il = %i, i2 = %i", il, i2); 

     exchangeValues(p1, p2); 
     NSLog(@"il = %i, i2 = %i", il, i2); 

     exchangeValues(&il, &i2); 
     NSLog(@"il = %i, i2 = %i", il, i2); 
    } 
    return 0; 
} 

輸出:

2012-08-02 11:13:38.569 Test[381:707] il = -5, i2 = 66 
2012-08-02 11:13:38.571 Test[381:707] il = 66, i2 = -5 
2012-08-02 11:13:38.572 Test[381:707] il = -5, i2 = 66 
+0

化妝'INT溫度;''進INT * temp'否則它可能會出現溫度是一個整數(在這種情況下,它被用作一個指向int) – 2012-08-02 15:37:56

+0

@ RamchandraApte否,'int'在這裏是正確的,'temp = * pint1;'將'pint1'的值存儲到'temp'中。 – 2012-08-02 15:42:41

+0

@DanielFischer正確,我不是很習慣C/C++(我是Pythonista) – 2012-08-04 12:58:00

回答

2

我會說這是一個複雜的例子,如果你正在教關於指針!

是否有某種轉換函數中的參數 即把P1,P2,& IL發生的事情,並& I2的指針的值(*)?像p1 變成* p1?

p1p2被聲明爲int *(指針int)並用的i1i2(使用&運算符)的地址被初始化。

我以爲變量的副本傳遞給函數的實際變量,而不是 ,所以爲什麼值的變量 通過功能後,改變了嗎?

可變的副本被傳遞給函數,然而,在這種情況下int *類型的變量(指針int)。值改變的原因是exchangeValues()函數取消引用這些指針並交換值。這是唯一的方法(在C/Objective-C中),函數可以修改自己作用域之外的變量,除了變量被指定爲函數的返回值。

此外,爲什麼我會在第3行發出警告,說:沒有以前 函數'exchangeValues'的原型?

你似乎打錯了;除去下面@autoreleasepool行:

@autoreleasepool { 
    void exchangeValues (int *pint1, int *pint2); <-- delete this line 
+0

但是爲什麼&i1和&i2允許被傳入?當這兩人通過時會發生什麼? – stumped 2012-08-02 15:55:35

+1

記住&i1是i1的地址,它和你的指針p1在這個例子中是一樣的(這是你需要能夠用箭頭繪製箱子到另一個箱子的經典指針圖表); – bph 2012-08-02 16:01:30

+1

換句話說類型&i1和p1是int *。由於類型是等價的,並且匹配函數參數類型,所以它們被允許作爲參數傳遞給那個函數 – bph 2012-08-02 16:09:14

1

如果你傳遞一個指針到函數,它的確是通過指針 - 副本,但它仍然是指在同一地址在內存中。因此,取消引用該指針仍將指向功能範圍之外的變量。

0

它的有點混亂,如何變量已宣佈和初始化所有在那樣的行,但基本上你有:

i1int設置爲-5 p1是一個指向int組的地址的i1

同樣適用於i2p2

沒有轉換正在發生。您正在有效地「交換」這些指針指向函數中的值。

指針是令人困惑的事情,但堅持使用它,它會成爲有足夠parctice和示例代碼像這樣明確...

1

我以爲變量的副本傳遞給函數,而不是實際的變量,那爲什麼傳入的變量的值在函數後改變了?

的副本指針被傳遞給這裏的函數。那麼函數指向的內存位置變量l1l2被存儲在哪裏。所以

void exchangeValues (int *pint1, int *pint2) { 
    int temp; 

    temp = *pint1; // store the value that pint1 points to in temp 
    *pint1 = *pint2; // store the value pint2 points to where pint1 points to 
    *pint2 = temp; // store the value saved in temp where pint2 points to 
}