一起Talk IOS吧(第十回 複合型別中的指標)

talk_8發表於2020-10-31

看官們,大家好,我們在上一回中介紹了複合型別中的陣列,這一回中我們將介紹複合型別中的指標。

指標是C語言中非常重要的部分,OC繼承了C中的指標,因此我們可以在OC程式設計中繼續使用它。指標也是一個變數,只不過它的是一個特殊的變數,特殊之處在於它的值是記憶體地址,這些地址可以是任意的記憶體地址,如果地址是其它變數的地址,那麼就可以使用指標間接地訪問變數。如果地址是無效的地址,那麼使用這種無效的地址會引起程式異常。這也是使用指標特別需要注意的地方。接下來我們通過具體的程式碼來演示如何使用指標。

#import<Foundation/Foundation.h>

int main() {
	int intValue = 3;
	int *pIntValue = &intValue;

	NSLog(@"value: %i , pointer value: %i",intValue,*pIntValue);

	int array[3] = {1,3,5};
	int *p = array;
	for(int i=0; i<sizeof(array)/sizeof(array[0]);i++)
		NSLog(@"value: %i",*(p+i));

	NSLog(@"address of p: %p",p);

	p = nil;
	NSLog(@"address of p: %p",p);

	char *pStr = "apple";
	if(pStr != nil) {
		NSLog(@"string: %s",pStr);
		pStr = nil;
	}else {
		NSLog(@"pStr is nil");
	}

	return 0;
}

編譯並且執行上面的程式,可以得到以下執行結果:

2020-10-31 21:12:45.651 ex.out[1734:84897] value: 3 , pointer value: 3
2020-10-31 21:12:45.651 ex.out[1734:84897] value: 1
2020-10-31 21:12:45.652 ex.out[1734:84897] value: 3
2020-10-31 21:12:45.652 ex.out[1734:84897] value: 5
2020-10-31 21:12:45.652 ex.out[1734:84897] address of p: 0x7ffee91cdabc
2020-10-31 21:12:45.652 ex.out[1734:84897] address of p: 0x0
2020-10-31 21:12:45.652 ex.out[1734:84897] string: apple

我們分析一下上面的程式碼,在程式碼中我們定義了指標變數pIntValue,它和普通變數定義時的區別就是多了一個號,這就是指標的特徵:在基本型別名稱後面加上號就定義了一個與基本型別匹配的指標變數。

大家看看,我們上面的程式碼中一共有幾個指標變數?答案是3.
一個int型別的指標變數pIntValue;第二個是int陣列型別的指標變數p;第三個是char型別的指標變數pStr。有看官問:指標也有型別嗎?答案是有。通過型別可以限制指標的執行範圍,比較我們在上面程式碼中的p+i就是使用指標在計算變數的地址,如果沒有型別限制指標,那麼這種運算就會出錯,因為程式無法知道指標加一後跳轉到哪個記憶體地址上。

我們通過第一個指標可以明白指標的定義,而且可以從程式輸出中看到指標中的具體存放的數值(address of p: 0x7ffee91cdabc)

我們接著看一下第二個指標,它指向了一個陣列,因為在OC中陣列名可以看作是地址,因此這樣做符合OC語法。我們在輸出陣列中成員的數值時,使用了指標加法運算,它和使用陣列下標輸出陣列中成員的數值效果相同。

最後,我們看一下第三個指標,它指向了一個字串,我們可以把指標當作字串來使用,這也是字串的典型用法。最後要注意的是,指標使用完成後把它設定為空指標:nil,這樣可以避免程式異常。注意一下空指標:OC使用nil,C使用NULL.這是他們的不同。

最後我們對本章回中的知識點進行回顧和總結:

  • 1.介紹了指標的定義和使用方法,實實在在地看到了指標的數值;
  • 2.指標有型別,用來限制指標的運算;
  • 3.陣列名稱和字串可以看作是指標;
  • 4.指標使用完就設定為空指標,空指標使用nil表示;

看官們,欲知後事如何且聽下回分解!

相關文章