小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關(guān)于指針的加減

 老匹夫 2015-03-29

關(guān)于指針的加減

 
 
一直以來都覺得對(duì)指針的加減是個(gè)很惡心的事情。雖然指針是個(gè)地址值,但是對(duì)指針的加N卻不是直接將地址值加N,而是增加N*sizeof(指針類型)……這一點(diǎn)很容易讓人疏忽。

一般情況下,對(duì)指針進(jìn)行加減運(yùn)算的代碼是很難讀的,但是各路考題卻總是樂此不疲。

看到這樣的道題目:

int main()
{
int a[5] = {1,2,3,4,5};
int *ptr1 = (int*)(&a + 1);
int *ptr2 = (int*)((int)a + 1);
printf("%x,%x\n", ptr1[-1], *ptr2);
return 0;
}

printf的輸出是什么呢(X86體系結(jié)構(gòu)下)?
5,2000000

int *ptr1 = (int*)(&a + 1); 得到的*ptr1是什么?
&a 和 a 和 &a[0],都是同一個(gè)值,但是它們類型不同。 &a 的類型是:int (*)[5],指向5個(gè)int的指針。所以,&a加1,就等于加了5個(gè)int的長(zhǎng)度。ptr1 = &a[5]。
printf ptr1[-1]的時(shí)候,由于ptr1是int*型的,減去1個(gè)int長(zhǎng)度,則打印的是a[4]的值。

int *ptr2 = (int*)((int)a + 1); 得到的*ptr2是什么?
同樣,(int)a 和 &a 和 a 和 &a[0],都是同一個(gè)值,但是它們類型不同。 (int)a的類型是int,是一個(gè)整型(注意,不是指針)。所以,加1就是直接加1。于是4個(gè)字節(jié)的int被截?cái)嗔恕?br>小端情況下(X86體系結(jié)構(gòu)),a按字節(jié)表示是: 0x01,0x00,0x00,0x00,0x02,0x00…… 地址值加1后,得到的int是0x00,0x00,0x00,0x02,連起來就是0x02000000。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多