2016-11-28 8 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)'回数だけ実行されます。これはあなたのマシンで '整数i 'が取るバイト数を表します。今これを@dhkeのコメントと組み合わせてください – Stefan

+0

あなたの質問がこのタイトルでうまくできているかどうかわかりません。答えのために、forの命令は、(q + k)アドレスのブロックに(p + k)アドレスの値に影響を与えます。 –

答えて

1

により、これらのステートメントに

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

オブジェクトijsizeof(int)文字を持つ文字配列のように(解釈)と考えられています。そして、このループ

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

にこれらの文字は、バイトによる整数変数jバイトの整数型変数iからコピーされます。

*(q + k)および*(p + k)については、q[k]およびp[k]と完全に等価です。チャーポインタが1バイトのみを指すことができるので、このようにループがこの構文iとjの最下位バイト次にpとqのポインティング

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; 

を用いて書き換えることができます。 forループでは、ポインタのインクリメントによってポインタが次のバイトを指すようになり、同時にバイトがqで指されるメモリにコピーされます。

0

あなたが探していたコードは、正確には、jの値を変数iにコピーします。バイト単位で処理します。

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

これは、pとqの値をそれぞれiとjの最初のバイトへのポインタとして初期化します。

sizeof(i); 

これは変数jのサイズをバイト数(この場合は4)で返します。

は、その後にループのために:

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

私たちは、これは番目のバイトメモリのアドレス[(Jの開始アドレス)+ K]をポイントし

*(q + k) 

に行きます。アドレス番目>

*(p+k) 

したがって、メモリ位置目(P + K)の各値は、(Q + K)が指し示すアドレスにコピーされる - iが変数に対して同じ適用。

したがって、j == iである。

関連する問題