Objective-C 指標



Objective-C 中的指標易於學習且有趣。一些 Objective-C 程式設計任務使用指標更容易完成,而其他任務(例如動態記憶體分配)則無法在不使用指標的情況下完成。因此,學習指標成為一名完美的 Objective-C 程式設計師是必要的。讓我們以簡單易懂的步驟開始學習它們。

如您所知,每個變數都是一個記憶體位置,每個記憶體位置都有其定義的地址,可以使用取地址符 (&) 運算子訪問,該運算子表示記憶體中的地址。考慮以下示例,它將列印已定義變數的地址:

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

編譯並執行上述程式碼後,會產生如下結果:

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

因此,您瞭解了什麼是記憶體地址以及如何訪問它,因此概念的基礎已經完成。現在讓我們看看什麼是指標。

什麼是指標?

指標是一個變數,其值是另一個變數的地址,即記憶體位置的直接地址。與任何變數或常量一樣,您必須在使用指標儲存任何變數地址之前宣告它。指標變數宣告的一般形式為:

type *var-name;

這裡,type 是指標的基礎型別;它必須是有效的 Objective-C 資料型別,而 var-name 是指標變數的名稱。用於宣告指標的星號 * 與用於乘法的星號相同。但是,在此語句中,星號用於將變數指定為指標。以下是有效的指標宣告:

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

所有指標的實際資料型別,無論是整數、浮點數、字元還是其他型別,都是相同的,一個表示記憶體地址的長十六進位制數。不同資料型別指標之間的唯一區別在於指標指向的變數或常量的型別。

如何使用指標?

有一些重要的操作,我們將經常使用指標來執行。(a) 我們定義一個指標變數,(b) 將變數的地址賦給指標,以及 (c) 最終訪問指標變數中可用地址處的值。這是透過使用一元運算子 * 來完成的,該運算子返回位於其運算元指定的地址處的變數的值。以下示例使用了這些操作:

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* actual variable declaration */
   int  *ip;         /* pointer variable declaration */  
   ip = &var;       /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

編譯並執行上述程式碼後,會產生如下結果:

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Objective-C 中的空指標

如果您沒有要分配的確切地址,則始終最好將 NULL 值賦給指標變數。這在變數宣告時完成。被賦予 NULL 的指標稱為指標。

NULL 指標是在多個標準庫中定義的值為零的常量。考慮以下程式:

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

編譯並執行上述程式碼後,會產生以下結果:

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

在大多數作業系統上,程式不允許訪問地址 0 處的記憶體,因為該記憶體由作業系統保留。但是,記憶體地址 0 具有特殊的意義;它表示指標並非旨在指向可訪問的記憶體位置。但是按照慣例,如果指標包含空(零)值,則假定它不指向任何內容。

要檢查空指標,您可以使用 if 語句,如下所示:

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

詳細介紹 Objective-C 指標

指標有很多但簡單的概念,它們對 Objective-C 程式設計非常重要。以下是一些重要的指標概念,Objective-C 程式設計師應該清楚:

序號 概念與描述
1 Objective-C - 指標運算

有四個算術運算子可以用於指標:++、--、+、-

2 Objective-C - 指標陣列

您可以定義陣列來儲存多個指標。

3 Objective-C - 指向指標的指標

Objective-C 允許您在指標上擁有指標,依此類推。

4 在 Objective-C 中將指標傳遞給函式

透過引用或透過地址傳遞引數都可以使被呼叫函式在呼叫函式中更改傳遞的引數。

5 在 Objective-C 中從函式返回指標

Objective-C 允許函式返回指向區域性變數、靜態變數和動態分配記憶體的指標。

廣告