今天小編就爲大家分享一篇關於運用指針在不用加號的情況進行加法運算的講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
平常我們進行加法運算都是用類似以下的代碼進行運算
#include<stdio.h> int main() { int a=2,b=3; printf("%d\n",a+b); return 0; }
其結果爲 5,對a和b進行了加法運算
但我們如何不用加號進行加法運算呢?先看一段數組運算
#include<stdio.h> int main() { int a[]={1,2}; printf("%d\n",a[0]+a[1]); return 0; }
運行結果是 3 ,它和以下這段代碼是相同的
#include<stdio.h> int main() { int a[]={1,2}; printf("%d\n",*(a+0)+*(a+1)); return 0; }
因爲 a[i]=*(a+i)
接下來我們簡單運用一下指針
#include<stdio.h> int main() { int a=2,b=3; int *p=a,*q=b; printf("%d\n",*p+*q); return 0; }
p和q分別指向了a和b的地址,將a和b的和計算,結果是 5
現在運用指針和剛纔說的a[i]=*(a+i)和變量存放地址進行一下結合
#include<stdio.h> int main() { int a=2,b=3; int *p; printf("%d\t%d\n",&a,&b); p=&a; printf("%d\n",(int)&((char *)a)[b]); return 0; }
輸出結果是
1638212 1638208
5
前面兩個值分別是a和b的地址,因爲是int類型且在我用的32位編譯器中是按四字節存儲的,然而char類型是按照一個字節一個字節存儲的,用指針p指向變量a,先看(char*)a,它是一個強制類型轉換,將a這個變量強制轉換成char*類型的地址,((char*)a)[b]則是將地址向後移b個字節,但此時的((char*)a)[b]等於*(a+b),我們知道&和*的作用相互抵消的,所以有了&((char*)a)[b],但此時它的類型仍爲char*,前面的(int)則是將其強制轉換位int進行輸出。
當時時候用的long定義的a和b,如果強制類型轉換爲int,long是八字節,而int是四字節,那麼就會造成數據丟失。
最後說一下剛得知的,可以用指針測試編譯器到底是64位還是32位,64位的編譯器指針變量是8字節,32位的則是4字節。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。如果你想了解更多相關內容請查看下面相關鏈接