Objective-C中的指針很容易和有趣的學(xué)習(xí)。更容易地執(zhí)行一些Objective-C語(yǔ)言的編程任務(wù)的指針,動(dòng)態(tài)內(nèi)存分配,其他的任務(wù),如不能執(zhí)行,而無(wú)需使用指針。因此,它成為必要學(xué)習(xí)指針成為一個(gè)完美的Objective-C程序員。讓我們開(kāi)始簡(jiǎn)單輕松的學(xué)習(xí)步驟。
如大家了解,每一個(gè)變量是一個(gè)內(nèi)存位置和每一個(gè)存儲(chǔ)單元都有其定義的地址,可以使用符號(hào)(&)的運(yùn)算符,它表示內(nèi)存中的地址訪(fǎng)問(wèn)??紤]下面的例子,這將打印地址定義的變量:
#import <Foundation/Foundation.h> int main () { int var1; char var2[10]; NSLog(@"Address of var1 variable: %x ", &var1 ); NSLog(@"Address of var2 variable: %x ", &var2 ); return 0; }
上面的代碼編譯和執(zhí)行時(shí),它產(chǎn)生的結(jié)果如下的內(nèi)容:
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
所以,明白了什么是內(nèi)存地址,以及如何訪(fǎng)問(wèn)它,這些是基本的概念?,F(xiàn)在,讓我們看到了什么是一個(gè)指針。
指針是一個(gè)變量,其值是另一個(gè)變量,即直接地址的內(nèi)存位置的地址。像任何變量或常量,在使用之前必須聲明指針,可以用它來(lái)存儲(chǔ)任何變量地址。一個(gè)指針變量聲明的一般形式是:
type *var-name;
在這里,type 為指針的基本類(lèi)型,它必須是一個(gè)有效的Objective-C的數(shù)據(jù)類(lèi)型和 var-name 是變量的指針。用來(lái)聲明指針的是一個(gè)星號(hào)(*)。然而,在這個(gè)聲明中的星號(hào)是被用來(lái)作為一個(gè)指針來(lái)指定一個(gè)變量。以下是有效的指針聲明:
int *ip; /* yiibaier to an integer */ double *dp; /* yiibaier to a double */ float *fp; /* yiibaier to a float */ char *ch /* yiibaier to a character */
所有的指針的值的實(shí)際數(shù)據(jù)類(lèi)型,無(wú)論是整數(shù),浮點(diǎn)數(shù),字符,否則,是一樣的,很長(zhǎng)的十六進(jìn)制數(shù)字,表示一個(gè)內(nèi)存地址。不同數(shù)據(jù)類(lèi)型的指針之間的唯一區(qū)別是變量或常量的指針指向的數(shù)據(jù)類(lèi)型。
有一些重要的操作,我們將非常頻繁地與指針的幫助。 (a)我們定義一個(gè)指針變量,(b)分配一個(gè)指針變量的地址,(c)最后訪(fǎng)問(wèn)提供的地址指針變量的值。這是通過(guò)使用一元運(yùn)算符*返回值的變量,其操作數(shù)位于指定的地址。下面的例子使用這些操作:
#import <Foundation/Foundation.h> int main () { int var = 20; /* actual variable declaration */ int *ip; /* yiibaier variable declaration */ ip = &var; /* store address of var in yiibaier variable*/ NSLog(@"Address of var variable: %x ", &var ); /* address stored in yiibaier variable */ NSLog(@"Address stored in ip variable: %x ", ip ); /* access the value using the yiibaier */ NSLog(@"Value of *ip variable: %d ", *ip ); return 0; }
上面的代碼編譯和執(zhí)行時(shí),它產(chǎn)生的結(jié)果如下的東西:
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
它始終是一個(gè)很好的做法,一個(gè)指針變量分配一個(gè)NULL值的情況下,沒(méi)有確切的地址被分配。這樣做是在當(dāng)時(shí)的變量聲明。被指定為NULL 指針,被稱(chēng)為一個(gè)空指針。
NULL指針是一個(gè)常數(shù)與幾個(gè)標(biāo)準(zhǔn)庫(kù)中定義的一個(gè)零值。考慮下面的程序:
#import <Foundation/Foundation.h> int main () { int *ptr = NULL; NSLog(@"The value of ptr is : %x ", ptr ); return 0; }
上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:
2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0
大部分的作業(yè)系統(tǒng),程序不允許被保留,因?yàn)樵搩?nèi)存由操作系統(tǒng)來(lái)訪(fǎng)問(wèn)內(nèi)存地址0處。然而,存儲(chǔ)器地址0具有特殊的意義,它的信號(hào),指針不指向一個(gè)可訪(fǎng)問(wèn)的存儲(chǔ)器位置。但是,按照慣例,如果一個(gè)指針包含空值(零),它被假定為指向什么。
要檢查空指針,可以使用一個(gè)if語(yǔ)句如下:
if(ptr) /* succeeds if p is not null */ if(!ptr) /* succeeds if p is null */
指針有很多,但簡(jiǎn)單的概念,他們?cè)贠bjective-C編程是非常重要的。有以下幾個(gè)重要的指針概念,這應(yīng)該是一個(gè)Objective-C語(yǔ)言程序員清楚:
概念 | 描述 |
---|---|
Objective-C 指針運(yùn)算 | 有四種算術(shù)運(yùn)算符,可以用在指針中: ++, --, +, - |
Objective-C 數(shù)組的指針 | 可以定義數(shù)組指針持有數(shù)值。 |
Objective-C 指向指針的指針 | Objective-C中可以讓一個(gè)指針指向指針。 |
Objective-C 傳遞指針的函數(shù) | 引用或按地址傳遞參數(shù)的功能,既可以傳遞的參數(shù)調(diào)用函數(shù)被調(diào)用函數(shù)改變。 |
Objective-C 函數(shù)返回指針 | Objective-C中允許一個(gè)函數(shù)返回一個(gè)指向局部變量,以及靜態(tài)變量和動(dòng)態(tài)分配的內(nèi)存。 |