指標是c語言的乙個重要的組成部分,是 c語言的核心、精髓所在,用好指標,可以在c語言的程式設計中起到事半功倍的效果。一方面,可以提高程式的編譯效率和執行速度以及實現動態記憶體的分配。使用指標可以使程式更加的靈活,便於表示各種資料結構,編寫高質量的程式。
今天我們就來討論一下指標裡面比較難的部分:指標的算術運算。
和其他的普通變數一樣,指標本質上也是乙個變數,如果把指標稱作位址變數,這樣就很容易理解指標了。普通的變數可以進行加減運算,類似的,指標也可以進行加減運算。但是指標的加減運算又不同於普通的變數那樣進行簡單的加某乙個數或者減某乙個數。
首先來看一下指標的加法:
(1)指標+數字:
int main()
定義了乙個整形的指標變數,由此結果可以看出,在進行指標的加法的時候,加的數字,需要調整,調整的權重就是sizeof(指標去掉乙個*),簡單來說,就是將指標的的*去掉乙個,只需要去掉乙個就好了,再看剩下的部分是什麼型別。如果還是乙個指標,那調整的權重就是4或者8.(如果是32位的系統,指標的大小就是4,64位的系統,指標的大小就是8).short型別的就是兩個位元組,則調整的權重就是兩個位元組,double型別的是8個位元組,調整的權重就是8.以此類推。但是需要我們注意的是:最後乙個的型別可不是指標哦,而是直接把指標型別的變數直接強制轉換為無符號的long long型別,此時他就是乙個普通的數字,所以最後乙個進行的就是數字的加法,直接用2000加上4,結果就是2004.所以在解決問題的時候,需要我們擦亮眼睛,認真的讀題審題,摳細節,才能夠成功
。(2)指標 - 數字:
指標的加法解決了,現在需要解決的問題就是指標的減法,指標的減法和指標的加法都是大同小異的。
int main()
這裡首先定義了乙個指標變數為ox2010,雖然是16進製制,但是在輸出的時候,也要求我們輸出16進製制,所以就不用進行數制之間的轉換,直接輸出16進製制就好了。這道題我們也很容易的用類似於加法的算術規則進行運算,就可以得出答案。但是在這裡需要注意的就是16進製制之間的加減運算。十六進製制和十進位制類似,只是本位上數值不夠的時候,需要上一位借位16,然後在進行加減運算。同時需要注意的是,最後一位並不是指標,而是乙個無符號型別的long型別的資料,在運算的時候,直接按照數字的運算進行就好了。
(3)指標+指標 指標-指標
指標可以加數字,那麼指標可以加指標嗎,可以減指標嗎?
我們先來考慮乙個這樣的問題,2023年+2023年是乙個什麼樣的結果,按照正常的思維去考慮,我們感覺他是沒有什麼實際意義的,所以在c語言裡面,指標加指標是非法的。那麼指標可以減指標嗎?
還是同樣的問題,2023年-2023年表示的是什麼意義呢?,按照正常的思維,2023年-2023年就是指的是2023年和2023年之間相差幾年,其結果是1 ,也就是相差了1。8月-7月也表示的是8月份與7月份之間相差了1個月,其答案是相同的,但是單位是不相同的,也就是說它們之間的單位也是不停的在調整的,由此我們可以得出以下的規律:指標-指標表示指標之間間隔的單元個數,具體方法為:1、算出位元組數;2、除以調整權重。我們來看一段**你就會懂了。
int main()
;//x
int *p = &arr[9];//x+36
int *q = &arr[1];//x+4
printf("%d\n",p-q);//8
printf("%d\n",q-p);//-8
printf("%d\n",(short *)p-(short *)q);//16
printf("%d\n",(long *)p-(long *)q);//8
printf("%d\n",(char **)p-(char **)q);//8
printf("%d\n",(double *)p-(double *)q);//4
printf("%d\n",(long long)p-(long long)q);//32
printf("%d\n",(char *)p-(char *)q); //32
return 0;
}
我們首先定義了乙個長的為10的陣列,其中首元素是0,其餘都是\0,再定義了乙個位址變數p儲存的是9號下標,定義了位址變數q儲存的是1號下標,然後讓我們來求的是指標的減法。根據上面的規律,我們首先求出之間間隔的位元組數,因為定義的是整型的陣列,所以p的位元組數為36,而q的位元組數為4.兩個相減就是其相差的位元組數大小也就是32,其他的按照調整的權重進行相減就好了。
(short *)p - (short *)q:(short *)去掉乙個*就是short,佔2個位元組,32/2=16;
(long *)p-(long *)q : (long *)去掉乙個*就是long ,佔4個位元組,32/4=8;
(char **)p-(char **)q : (char **)去掉乙個*就是char* ,指標佔了4個位元組,32/4=8;
(long long)p - (long long )q : 括號裡面是(long long)型別,也就是直接強轉為了(long long)型別,沒有*可以去,所以直接就是數字的減法。
(char *)p-(char *)q :去掉乙個*後是乙個char型別,佔乙個位元組,32/1=32;
這些就是指標的算數運算,我們在實際的程式設計中需要注意。
指標的算術運算
指標可以加上或減去乙個整數的算術運算。首先來看個例子 include int main void short st 3 double pw wa short ps st 0 cout pw 分析上面的程式,我們可以看到,c 一般把陣列名和第乙個元素的位址等價,所以我們可以用上面的兩種方法初始化指標,...
指標的算術運算
指標和陣列 指標和陣列在c語言中有錯綜複雜的聯絡。在前面的課程中,你學會了如何宣告陣列變數 int anarray 5 declare array of 5 integers 關聯陣列實際上是指標,指向陣列的第乙個元素!因為陣列變數 是指標,你可以解析它 它返回 陣列元素0 123 4567 int...
指標的算術運算
指標的算術運算 c語言允許你在指標執行整數的加減運算。如果pnptr指向乙個整數,pnptr 1 pnptr後在記憶體中的位址的下乙個整數。pnptr 1是在pnptr以前的整數字址。請注意,pnptr 1不在pnptr返回位址,但下乙個物件,pnptr分型。如果pnptr指向乙個整數 假設4位元組...