一、指標算數運算
我們已經了解到,指標加上乙個整數的結果是另乙個指標。但問題是,它指向**呢?如果將乙個字元指標加1,運算結果產生的指標指向記憶體中的下乙個字元。float佔據的記憶體空間不止1個位元組,如果將乙個指向float的指標加1,將會發生什麼,它會不會指向該float值內部的某個位元組呢?
接下來我們通過指標在陣列中的應用進行假設:
請看下面這些宣告:
int arr[10] = ;
int*p = arr;
*p = 10;
p++;
*p = 20;
假設1:指標加1表示加乙個位元組(該假設最終不成立,我下面寫了這麼多是為了具體解釋一下記憶體和變數的關係)
通過上面的宣告我們可以精確的計算出p+1的具體值,倘若假設成立,我們則要對陣列裡的儲存的數值做以下調整,具體調整思路如下:
(1)陣列初始化時,將陣列的前6個元素依次賦值為1,2,3,4,5,6。接下來定義了乙個指標變數p,指向陣列元素的首位址,第3條語句對指標變數p所指向的記憶體中所儲存的值進行重新賦值(即把10儲存在arr[0]中)。
(2)假如我們的假設成立,p+1表示指標加乙個位元組,即指標變數向後移動乙個位元組,起初arr[0]為乙個整型資料,包含了4個位元組,每個位元組包含8個位,即arr[0]佔了32個位,我們將記憶體放大來看,在執行*p=10的操作時,10這個數值儲存在了佔4個位元組,32個位的記憶體位址中,我們將位簡化表示,4個位可以用乙個16進製制數代替,32個位,也就需要8個16進製制數表示,每兩個16進製制數佔乙個位元組。
(3)遵循「低位址儲存低位」的原則,10的16進製制數值為a,因而第乙個格仔裡的資料為0a,其餘位置用0填滿,假設p+1表示指標加乙個位元組,即指標變數向後移動乙個位元組,接下來*p=20這條語句我們按照同樣的方式處理,得到位址為101的框內資料為14(20的16進製制數值),其餘位置繼續用0填滿。當我們對指標變數p解引用時,我們最終的結果便是綠色框裡所有資料所表示的16進製制數(按照低位低位址的儲存原則,重新調整順序為140a),最終計算結果*p=20,arr[0]=5130。
(4)我上邊已經提到過,指標的加法顯然不是這麼回事,因為這樣做沒有任何意義,並且出現的結果讓人難以捉摸。因而假設不成立,要想讓假設「成立」,我們可以參照下面宣告:
#include"stdio.h"
int main()
; int
*p = arr;
*p = 10;
p = (int
*)((char *)p+1);
*p = 20;
printf("*p=%d\n",*p);
printf("arr[0]=%d",arr[0]);
}}
執行結果如下:
假設2:指標加1表示加整個陣列的長度
這種假設毫無意義,因為我們定義使用指標的目的是對陣列進行操作,這樣的加法操作不是計算機語言開發設計者所想看到的,當然也不是我們理想中的指標算數運算。
假設3:指標加法是加陣列的乙個單元格(即指向陣列下乙個單元格)
經過長時間的討論分析,我們最終得到了這個假設。這個假設無論是從指標變數設計的初衷,還是從指標變數的操作來看,都是最實用、最直接的指標算數運算方式。
總結:指標的算數運算在陣列中的操作物件是陣列的單元格,指標加上或是減去乙個數值,本身都需要調整。
調整的方法具體是:調整的權重為指標去掉乙個*號,然後對剩下的資料型別求sizeof。
今天的分享就到這裡,下次我們繼續**各種資料型別的指標進行算術運算的具體規則和基本應用。
冪運算 陣列 快速冪運算在動態規劃中的應用
我們知道動態規劃主要可以用來解決兩類問題 優化問題 組合計數問題 花花今天就來和大家聊一聊在組合計數問題中,如何使用快速冪運算來進行加速,把時間複雜度從o n 降低到o logn 用到的知識點有二進位制和矩陣運算。狀態轉移方程 dp i 0 dp i 1 0 3 dp i 1 1 2 dp i 1 ...
指標在陣列中的應用 !
乙個變數有位址,乙個陣列包含若干個元素,每個陣列元素都在記憶體中占用儲存單元,他們都有響應的位址。既然指標可以指向變數,也就意味著它也可以指向陣列元素,即把某個元素的位址放到乙個指標變數中。所以所謂陣列元素的指標就是陣列元素的位址。定義乙個有10個元素的整形陣列,int a 10 定義乙個指向整形變...
指標中的算數運算
一 指標所佔的位元組 在x86 或者32位平台的指標4佔位元組。在x64 或者64位平台的指標8佔位元組。二 指標加法運算 指標加法運算需要調整,調整的權重是指標本身去掉乙個 號,在求sizeof 例1 int main 三 指標減法運算 指標減法運算需要調整,調整的權重是指標本身去掉乙個 號,在求...