2016-11-28 132 views
-3

我只需要使用一個指向char的指針來指定變量「i」的變量「j」的值。我無法編寫代碼,所以我看到這個解決方案,但我不明白「for」主體中會發生什麼。有人可以向我解釋嗎?有人可以解釋代碼?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main(int argc, char **argv) { 
int i = 10; 
int j = 20; 
char *p, *q; 

p = (char*)&i; 
q = (char*)&j; 

for(int k = 0; k < sizeof(i); ++k) { 
    *(q + k) = *(p + k);  
} 

printf("%d == %d\n", i, j); 

return 0; 
} 
+1

'*(q + k)'與'q [k]'相同。從那裏出發。 – dhke

+0

指向char的指針將指向整數的單獨字節。你的循環運行'sizeof(i)'次數,它代表'integer i'在你的機器上的字節數。現在結合@dhke的評論 – Stefan

+0

不確定你的問題是否適合這個標題。對於答案,for中的指令影響(p + k)地址的值到(q + k)地址處的塊中。 –

回答

1

由於這些語句

p = (char*)&i; 
q = (char*)&j; 

i對象和j被認爲是(解釋)等具有sizeof(int)字符的字符陣列。並且在該環

for(int k = 0; k < sizeof(i); ++k) { 
    *(q + k) = *(p + k);  
} 

這些字符是從整數變量i成由字節整型變量j字節複製。

至於這些表達式*(q + k)*(p + k)它們完全等價於q[k]p[k]。因此,該回路可以使用此語法

for(int k = 0; k < sizeof(i); ++k) { 
    q[k] = p[k];  
} 
+0

謝謝,現在我明白了。使用'++ k'而不是'k ++'沒有區別? – SerPecchia

+0

@GianniCaringi如果要將它們用作獨立表達式,那麼基本類型沒有區別。 –

0
p = (char*)&i; 
q = (char*)&j; 

現在p和q指向我的最低字節和j因爲字符指針可以指向只有一個字節被重寫。在for循環中,指針增量指向指向下一個字節的指針,同時字節被複制到由q指向的內存中。

0

該代碼完全符合您的要求,將j的值複製到變量i中。但它是逐字節地進行的。

p = (char*)&i; 
q = (char*)&j; 

這將p和q的值初始化爲分別指向i和j的第一個字節的指針。

sizeof(i); 

這將返回變量j的字節數(在本例中爲4)的大小。

然後在for循環:

for(int k = 0; k < sizeof(i); ++k) { 
    *(q + k) = *(p + k);  
} 

我們去

*(q + k) 

這指向的內存地址[(起點j的地址)+ K]個字節。 同樣適用於變量i - >

*(p+k) 

因此然後在第(p + k)次存儲器位置中的每個值被複制到由(Q + k)次地址所指向的地址。

因此我們有j == i。