一起Talk IOS吧(第十回 複合型別中的指標)
看官們,大家好,我們在上一回中介紹了複合型別中的陣列,這一回中我們將介紹複合型別中的指標。
指標是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表示;
看官們,欲知後事如何且聽下回分解!
相關文章
- 一起Talk IOS吧(第七回 OC中基本型別的程式碼演示)iOS型別
- 一起Talk IOS吧(第十八回 OC中的繼承例項)iOS繼承
- 第 10 節:複合型別-5. 指標 -- 指標與指標變數 -8. 多級指標型別指標變數
- 複合資料型別和遊標資料型別
- golang中 值型別,指標,引用的區別Golang型別指標
- 一起Talk IOS吧(第十四回 類中方法的定義和使用)iOS
- go 方法接受者 是指標型別和非指標型別的 區別Go指標型別
- 一起Talk IOS吧(第十二回 OC中程式結構程式碼演示)iOS
- c指標型別的作用指標型別
- C#指標型別C#指標型別
- Java中基本型別Array與複合型別List的互相轉換Java型別
- 複合型別(json)型別JSON
- Swift Talk:理解值型別Swift型別
- 複合指標、派生指標是什麼,你搞清楚了嘛?指標
- golang 指標型別引起的神奇 bugGolang指標型別
- Scala結構型別與複合型別解析型別
- 常見指標型別入門指標型別
- 檢視錶中複合資料型別內容資料型別
- oracle-複合資料型別Oracle資料型別
- PL/SQL複合資料型別SQL資料型別
- 第十五章:指標型別指標型別
- 要點1:指標、陣列和複合字面量指標陣列
- Go 複合型別之字典型別介紹Go型別
- 第 10 節:複合型別 2: 切片型別
- 淺談oracle複合資料型別Oracle資料型別
- 02. 複合型別(Composite Types)型別
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- Golang研學:在用好Golang指標型別Golang指標型別
- Rust 中的Box指標使遞迴型別成為可能 - Knoldus BlogsRust指標遞迴型別
- Solidity-變數和資料型別[複合型別_1]Solid變數資料型別
- 第 10 節:複合型別 1:陣列型別陣列
- 第 10 節:複合型別 小練習!型別
- PLSQL學習-【4複合資料型別】SQL資料型別
- 淺談oracle複合資料型別 (1)Oracle資料型別
- 淺談oracle複合資料型別 (2)Oracle資料型別
- Unreal 各種指標型別是怎麼回事Unreal指標型別
- 函式指標複雜的例子函式指標
- 不同型別的指標型別指標