溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

運(yùn)用指針在不用加號(hào)的情況進(jìn)行加法運(yùn)算的講解

發(fā)布時(shí)間:2020-10-08 20:29:49 來源:腳本之家 閱讀:139 作者:sdr_zd 欄目:編程語言

平常我們進(jìn)行加法運(yùn)算都是用類似以下的代碼進(jìn)行運(yùn)算

#include<stdio.h>
int main()
{
 int a=2,b=3;
 printf("%d\n",a+b);
 return 0;
}

其結(jié)果為 5,對(duì)a和b進(jìn)行了加法運(yùn)算

但我們?nèi)绾尾挥眉犹?hào)進(jìn)行加法運(yùn)算呢?先看一段數(shù)組運(yùn)算

#include<stdio.h>
int main()
{
 int a[]={1,2};
 printf("%d\n",a[0]+a[1]);
 return 0;
}

運(yùn)行結(jié)果是 3 ,它和以下這段代碼是相同的

#include<stdio.h>
int main()
{
 int a[]={1,2};
 printf("%d\n",*(a+0)+*(a+1));
 return 0;
}

因?yàn)?a[i]=*(a+i)

接下來我們簡單運(yùn)用一下指針

#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的和計(jì)算,結(jié)果是 5

現(xiàn)在運(yùn)用指針和剛才說的a[i]=*(a+i)和變量存放地址進(jìn)行一下結(jié)合

#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;
}

輸出結(jié)果是

1638212        1638208
5

前面兩個(gè)值分別是a和b的地址,因?yàn)槭莍nt類型且在我用的32位編譯器中是按四字節(jié)存儲(chǔ)的,然而char類型是按照一個(gè)字節(jié)一個(gè)字節(jié)存儲(chǔ)的,用指針p指向變量a,先看(char*)a,它是一個(gè)強(qiáng)制類型轉(zhuǎn)換,將a這個(gè)變量強(qiáng)制轉(zhuǎn)換成char*類型的地址,((char*)a)[b]則是將地址向后移b個(gè)字節(jié),但此時(shí)的((char*)a)[b]等于*(a+b),我們知道&和*的作用相互抵消的,所以有了&((char*)a)[b],但此時(shí)它的類型仍為char*,前面的(int)則是將其強(qiáng)制轉(zhuǎn)換位int進(jìn)行輸出。

當(dāng)時(shí)時(shí)候用的long定義的a和b,如果強(qiáng)制類型轉(zhuǎn)換為int,long是八字節(jié),而int是四字節(jié),那么就會(huì)造成數(shù)據(jù)丟失。

最后說一下剛得知的,可以用指針測試編譯器到底是64位還是32位,64位的編譯器指針變量是8字節(jié),32位的則是4字節(jié)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI