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;
}

執行上面範例程式碼,得到以下結果:

2018-11-15 03:56:08.348 main[108988] Address of var1 variable: fe8568c0
2018-11-15 03:56:08.351 main[108988] Address of var2 variable: fe8568c6

通過上面程式碼,了解了什麼是記憶體地址以及如何存取它,到此,概念的基礎知識已經結束。 接下來看看什麼是指標。

1. 指標是什麼?

指標是一個變數,它的值是另一個變數的地址,即儲存單元的直接地址。 與任何變數或常數一樣,必須先宣告指標,然後才能使用它來儲存任何變數地址。 指標變數宣告的一般形式是 -

type *var_name;

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

int    *ip;    /* 指向 int 型別的指標 */
double *dp;    /* 指向 double 型別的指標 */
float  *fp;    /* 指向 float 型別的指標 */
char   *ch     /* 指向 char 型別的指標 */

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

2. 如何使用指標?

有一些重要的操作,經常在指標的幫助下完成。使用指標的步驟如下 -

  • 定義一個指標變數,
  • 將變數的地址賦給指標,
  • 最後存取指標變數中可用地址的值。

這是通過使用一元運算子*來完成的,該運算子*返回位於運算元指定的地址處的變數值。以下範例使用這些操作 -

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* 變數定義 */
   int  *ip;         /* 指標變數宣告 */  
   ip = &var;       /* 在指標變數中儲存 var 的地址*/

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

   /* 儲存在指標變數中的地址 */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* 使用指標存取該值 */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

執行上面範例程式碼,得到以下結果:

2018-11-15 04:05:36.179 main[80041] Address of var variable: 23bea2dc
2018-11-15 04:05:36.183 main[80041] Address stored in ip variable: 23bea2dc
2018-11-15 04:05:36.183 main[80041] Value of *ip variable: 20

3. Objective-C NULL指標

如果沒有要分配的確切地址,最好將NULL值分配給指標變數。這是在變數宣告時完成的。 指定為NULL的指標稱為空指標。

NULL指標是一個常數,在幾個標準庫中定義了零值。參考以下程式 -

#import <Foundation/Foundation.h>

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

執行上面範例程式碼,得到以下結果:

2018-11-15 04:26:24.203 main[40259] The value of ptr is : 0

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

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

if(ptr)     /* 如果p不為null,則成立 */
if(!ptr)    /* 如果p為null,則成立 */

4. 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允許函式返回指向區域性變數,靜態變數和動態分配記憶體的指標。