int t[ ] = { 0x0203, 0x4 };
char *p=t;
printf(" *p = %d; *(p+1) = %d ",*p,*(p+1));
爲什麼*(p + 1)總是返回2,而不管t中的第二個元素?Int爲char數組。它是如何工作的?
int t[ ] = { 0x0203, 0x4 };
char *p=t;
printf(" *p = %d; *(p+1) = %d ",*p,*(p+1));
爲什麼*(p + 1)總是返回2,而不管t中的第二個元素?Int爲char數組。它是如何工作的?
char*
一個點包含char
即8比特的塊,
一個int*
點包含一個int
即32位的塊。
現在,原來的陣列是一種int
,存儲嵌段在存儲器中作爲:
t[0] = 0x 00 00 02 03
t[1] = 0x 00 00 00 04
-------------- ------ ------
| 03 | 02 | 00 | 00 | <----- stored as little endian
------- ------ ------ ------
^
&t[0],p (both point to this same address)
------- ------ ------ ------
| 04 | 00 | 00 | 00 |
------- ------ ------ ------
^
&t[1]
但指針arithmatic是不同爲char*
&一個int*
:
char*++
墊款因爲,8位以及它所表示的數據類型(char
)是8位。 類似地,int*++
前進32位,因爲它代表的數據類型(int
)是32位。
所以,你的情況,這是P,(P + 1)指向:
-------------- ------ ------
| 03 | 02 | 00 | 00 | <----- stored as little endian
------- ------ ------ ------
^ ^
p p+1
------- ------ ------ ------
| 04 | 00 | 00 | 00 |
------- ------ ------ ------
^
&t[1]
您正在使用little endian計算機運行此程序。這意味着你的int數組存儲在存儲器中,如以下順序字節:
×03 0×02 0×00 0×00(第一整數) 0×04 0×00 0×00 0×00(第二整數)
嘗試對之間0 P打印出*(p+i)
和7,它應該驗證這一點。
*(p+1)
是指向第一個int的第二個字節的指針。
整數以小尾數格式存儲在大多數機器上。
因此0x0203
存儲爲03 02 00 00
,這就是爲什麼你得到02
作爲回報。
您會看到指針數學如何在不同大小的整數以及機器的字節順序上產生影響。
在一個小端架構體系結構上(比如你使用的任何東西 - 可能是一個Intel處理器),值都存儲在內存中,最低位字節在前。所以,當你宣佈一個64字節的整數值0x0202,它被存放在內存中:
0302 0000 0000 0000
通過具有p指向同一個地方作爲T,* P現在是0×03。但是,對指針進行算術將其值增加了您要求的乘以對象的大小。在你的情況下,t指向0x0203的開始,並將1加1,實際上其值增加1 倍 int的大小,8,使其指向0x04。
給p的值加1會使其前進1 次字符的大小1,使其指向內存中的下一個字節。這就是02佔據的位置。
如果你想看到的4,試試這個:
printf(" *p = %d; *(p+1) = %d ",*p,*(p+8));
如果不工作,或者您的機器或編譯器與32位整數粘你,你應該可以看到04同此:
printf(" *p = %d; *(p+1) = %d ",*p,*(p+4));
字符的大小是不一樣的整數的大小。因此,指針算術移動的量不同。 – chris