2 回答

TA貢獻1804條經驗 獲得超8個贊
這個問題與線程或全局變量無關,與C的指針算術有關。
您可以使用以下代碼獲得完全相同的結果:
int main()
{
int i = 5;
int *j = 5;
i = i + j;
printf("%d\n", i); // this is 25
}
這里發(fā)生的是,您將指針j分配給值5,并對該指針“加5”。向指針添加5等同于在內存中添加足夠的空間來容納該指針指向的5個對象。在這種情況下,sizeof(int)為4,因此您實際上要添加4 * 5,即20。因此,結果為25,即5 + 4 * 5 = 25。
另一個警告是,由于sizeof(int)與機器有關,因此您的結果可能會有所不同。
讓我再舉一個例子,使這一點更加清楚:
int main()
{
int i = 5;
uint64_t *j = 5;
i = i + j;
printf("%d\n", i); // result is 45
}
由于sizeof(uint64_t)為8,這等效于將5 * 8加上原始值5,因此結果為5 + 5 * 8 = 45。
此代碼演示了類型轉換的許多問題。首先將“ x”聲明為“ int”,轉換為通用指針“ void *”,然后隱式轉換為“ int *”,然后轉換回“ int”。正如您已經在此處顯示的那樣,這些類型的投射肯定會讓您腳踩到腳。
添加回答
舉報