指標運算
(1)賦值運算
指標變數可以互相賦值,也可以賦值某個變數的地址,或者賦值一個具體的地址

(2)指標與整數的加減運算
指標變數的自增自減運算,指標加 1 或減 1 運算,表示指標向前或向后移動一個單元(不同型別的指標,單元長度不同),這個在陣列中非常常用,
指標變數加上或減去一個整形數,和第一條類似,具體加幾就是向前移動幾個單元,減幾就是向后移動幾個單元,

(3)關系運算
假設有指標變數 px、py,
px > py 表示 px 指向的存盤地址是否大于 py 指向的地址
px == py 表示 px 和 py 是否指向同一個存盤單元
px == 0 和 px != 0 表示 px 是否為空指標

指標與陣列
之前我們可以通過下標訪問陣列元素,學習了指標之后,我們可以通過指標訪問陣列的元素,在陣列中,陣列名即為該陣列的首地址,結合上面指標和整數的加減,我們就可以實作指標訪問陣列元素,
指向陣列的指標
如以下陳述句:

上面陳述句定義了一個陣列 nums,在定義時分配了 10 個連續的int 記憶體空間,而一個陣列的首地址即為陣列名nums,或者第一個元素的首地址也是陣列的首地址,那么有兩種方式讓指標變數 p 指向陣列 nums:

上面兩句是等價的,

如下幾個操作,用指標操作陣列:
*p = 1,此操作為賦值操作,即將指標指向的存盤空間賦值為 1,此時 p 指向陣列 nums 的第一個元素,則此操作將 nums 第一個元素賦值為 0,即 nums[0] = 1,
p + 1,此操作為指標加整數操作,即向前移動一個單元,此時 p + 1 指向 nums[0]的下一個元素,即 nums[1],通過p + 整數可以移動到想要操作的元素(此整數可以為負數),
如上面,p(p + 0)指向 nums[0]、p + 1 指向 nums[1]、、、類推可得,p+i 指向 nums[i],由此可以準確操作指定位置的元素,
在 p + 整數的操作要考慮邊界的問題,如一個陣列長度為 2,p+3 的意義對于陣列操作來說沒有意義,
下面寫一段代碼,用指標訪問陣列的元素:

注:陣列名不等價于指標變數,指標變數可以進行 p++和&操作,而這些操作對于陣列名是非法的,陣列名在編譯時是確定的,在程式運行期間算一個常量,
字符指標與字符陣列
在 C 語言中本身沒有提供字串資料型別,但是可以通過字符陣列和字符指標的方式存盤字串,
(1)字符陣列方式
這個在前面應該學習過,這里就不贅述了,

(2)字符指標方式
指標方式操作字串和陣列操作字串類似,可以把定義的指標看做是字符陣列的陣列名,在記憶體中存盤大致如下,這里為了方便換了個字串:

注:字符指標方式區別于字符陣列方式,字符陣列不能通過陣列名自增操作,但是字符指標是指標,可以自增操作,自增自減少會實作什么效果大家可以自己嘗試運行一下
下面做個小練習,利用字符指標將字符陣列 sentence 中的內容復制到字符陣列 word 中:

注:指標變數必須初始化一個有效值才能使用
多級指標及指標陣列
(1)多級指標
指標變數作為一個變數也有自己的存盤地址,而指向指標變數的存盤地址就被稱為指標的指標,即二級指標,依次疊加,就形成了多級指標,我們先看看二級指標,它們關系如下:

其中 p 為一級指標,pp 為二級指標,二級指標定義形式如下:

和指標變數的定義類似,由于*是右結合的,所以*pp 相當于*(*p),在本次定義中,二級指標的變數名為 pp,而不是**p,多級指標的定義就是定義時使用多個“*”號,下面用一個小程式給大家舉例:

注:在初始化二級指標 ppi 時,不能直接 ppi = &&i,因為&i 獲取的是一個具體的數值,而具體數字是沒有指標的,
(2)指標陣列
指標變數和普通變數一樣,也能組成陣列,指標陣列的具體定義如下:

下面舉一個簡單的例子熟悉指標陣列:
//定義一個陣列intnums[5] = {2,3,4,5,2}, i;//定義一個指標陣列int*p[5];//定義一個二級指標int**pp;//回圈給指標陣列賦值for(i =0; i <5; i++){ p[i] = &nums[i]; }//將指標陣列的首地址賦值給 pp,陣列 p 的陣列名作為 p 的首地址,也作為 p 中第一個元素的地址,//陣列存放的內容為普通變數,則陣列名為變數的指標;陣列存放的內容為指標,則陣列名為指標的指標,pp = p;//利用二級指標 pp 輸出陣列元素for(i =0; i <5; i++){//pp == &p[0] == &&nums[0],nums[0] == *p[0] == **ppprintf("%d", **pp);//指標變數+整數的操作,即移動指標至下一個單元pp++; }
指標與多維陣列
講多維陣列是個麻煩的事,因為多維陣列和二維陣列沒有本質的區別,但是復雜度倒是高了許多,這里我主要還是用二維陣列來舉例,但是還是會給大家分析多維陣列和指標的關系,
(1)多維陣列的地址
先用一個簡單的陣列來舉例:
int nums[2][2] = {
{1, 2},
{2, 3}
};
我們可以從兩個維度來分析:
先是第一個維度,將陣列當成一種資料型別 x,那么二維陣列就可以當成一個元素為 x 的一維陣列,
如上面的例子,將陣列看成資料型別 x,那么 nums 就有兩個元素,nums[0]和 nums[1], 我們取 nums[0]分析,將 nums[0]看做一個整體,作為一個名稱可以用 x1 替換,則 x1[0]就是 nums[0][0],其值為 1,

我們知道陣列名即為陣列首地址,上面的二維陣列有兩個維度,首先我們把按照上面 1 來理解,那么 nums 就是一個陣列,則nums 就作為這個陣列的首地址,第二個維度還是取 nums[0],我們把 nums[0]作為一個名稱,其中有兩個元素,我們可以嘗試以下陳述句:

此陳述句的輸出結果為一個指標,在實驗過后,發現就是 nums[0][0]的地址,即陣列第一個元素的地址,
如果再多一個維度,我們可以把二維陣列看做一種資料型別 y,而三維陣列就是一個變數為 y 的一維陣列,而陣列的地址我們要先確定是在哪個維度,再將陣列某些維度看成一個整體,作為名稱,此名稱就是該維度的地址(這里有些繞),
例:

三維陣列實際存盤形式如下:

實際存盤內容的為最內層維度,且為連續的,對于 a 來說,其個跨度為 4 個單元;對 a[0]來說,其跨度為 2 個單元;對 a[0][0]來說,跨度為一個單元,有上面還可以得出:

上面的等式只是數值上相等,性質不同,
(2)多維陣列的指標
在學習指標與陣列的時候,我們可以如下表示一個陣列:

在前面講指標陣列時,所有指標陣列元素都指向一個數字,那么我們現在可以嘗試用指標陣列的每個元素指向一個陣列:

這里可能不能理解為什么*p + 1 = &nums[0][1],而不是 nums[1],*p 獲得的是一個一維陣列,而 int 陣列 + 1 的跨度只有 4 個位元組,也就是一個單元,前面 p 是一維陣列的指標,其跨度為一個陣列,所以*p + 1 = &nums[0][1],而 p + 1 = nums[1],
指標與函式
前面學習函式學到,函式引數可以為 int、char、float 等,但是在操作時,這些引數只作為形參,所有操作都只在函式體內有效(除對指標的操作外),那么今天來學習一下指標作為函式引數,
函式引數為指標
我們直接做一個練習,定義一個函式,用來交換兩個變數的內容,

代碼非常簡單,我也就不細講了,這里傳入的引數為指標,所以呼叫 swap 方法后 x,y 的內容發生了交換,如果直接傳入 x,y,那么交換只在 swap 中有效,在 main 中并沒有交換,
函式的回傳值為指標
回傳值為指標的函式宣告如下:

在函式呼叫前要宣告需要對函式宣告(有點編譯器不需要)

除了上面的操作,更實用的是回傳一個指向陣列的指標,這樣就實作了回傳值為陣列,
指向函式的指標
C 語言中,函式不能嵌套定義,也不能將函式作為引數傳遞,但是函式有個特性,即函式名為該函式的入口地址,我們可以定義一個指標指向該地址,將指標作為引數傳遞,
函式指標定義如下:

函式指標在進行“*”操作時,可以理解為執行該函式,函式指標不同與資料指標,不能進行+整數操作,
下面舉個例子,來使用函式指標:

利用函式指標呼叫方法具體操作如下:
如果你想更好的提升你的編程能力,以便更好從事編程類作業的話!那么你很幸運~分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)

歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/169649.html
標籤:其他
上一篇:python中四種數值交換方法
