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允許函數返回指向局部變數,靜態變數和動態分配記憶體的指針。 |