2017-06-23 17 views
0

以下のプログラムの出力は0 2ですが、出力は<garbage value> 2と予想されます。誰かがなぜ出力が0 2であるのかを説明できますか?Cポインタチャレンジの出力を説明してください。

世界の主要エンジニアリング機関の1つで、入試で質問されました。 iとjの上記のコードの最初の値で

#include<stdio.h> 
    void f(int *p, int *q) 
    { 
     p = q; 
    *p = 2; 
    } 
    int i = 0, j = 1; 
    int main() 
    { 
     f(&i, &j); 
     printf("%d %d \n", i, j); 
     getchar(); 
     return 0; 
    } 
+6

あなたは何を期待していますか?私にとってはかなり簡単です。私は施設の主役に疑問を抱いています... –

+0

なぜあなたはごみの価値を期待していますか?すべてのポインタが明確に定義され使用されているわけではありませんか? – AntonH

+1

@usrなぜ '0'はガベージ値ですか? 'int i = 0'と変更されたものはありません。 –

答えて

0

p = qfの割り当ては、機能本体自体に限定されています。 iが指しているメモリの場所を変更しないという意味です。 *p = 2;の後にpの値を印刷すると、fの値は2になります。しかし、関数呼び出しが終了すると、pのqへの割り当てはiに転送されません。アドレスの割り当てをqからpに戻すには、f(int **p, int *q)タイプのパラメータが必要です。

+0

** a)**' i'ポインタではありません。 ** b)** 'p'はポインタです。つまり、関数fの "value"がアドレスになります。 ** c)** _ "ただし、関数呼び出しが終了すると、' p'の 'q'への割り当ては' i'に転送されません。 '_...これはどういう意味ですか?あなたは関数へのポインタを渡しているので、 'main'の変数の値は関数が終了した後に変更できますが、' i'は最初に変更されませんでした。 ** d)**なぜ世界ではポインタへのポインタが必要ですか? – iRove

+0

'i'は変数です。アドレス「0xAAAA」に値「i」が格納されているとします。同様に、jがaddreess 0xBBBBを指すと仮定します。 'i'のアドレスは関数' f'に渡されます。関数 'f'の中で' p'は0xAAAAを指すが、 'p = q'文の後に' p'は 'q'のアドレスを指している。これは0xBBBBである。 '* p = 2;'はアドレス0xBBBBに2を格納します。関数の実行が終了すると、iの値は0である0xAAAAから取り出され、 'j 'の値は2の0xBBBBから取られます。これが役に立ちます。 – MKR

+0

はい - これらの仮想アドレスがあれば、それはすべて真です。しかし、私はあなたの答えの情報を参照していました。 (a)が関係するところでは、あなたが言いました、 "私が指しているメモリの場所を変更してください。" _、 'i'はポインタです。 (b)について:もしあなたがpの値を関数 'f'に出力するならば、値は2になります。" _ - 'p'自体の" value "はアドレスではなく、2ではありません。しかし、 'p' _points to_の値は2になります。(c)あなたの答えの一部が本当に明確に言われていないことを指摘してください。脇:私は厳しいものではない、私は答えがより明確になると信じています。 – iRove

2

です:

i=0 j=1 

はのは、私はいくつかのメモリ位置1000およびJであると仮定しましょうあなたはfucntionを呼び出したときに2000年

でありますF():その後、

p will be 1000 and q will be 2000. 

あなたは、p = qは

呼び出しますあなたは* pを= 2

2 will be stored in location 2000 ie j = 2 

呼び出すときは、iとjを印刷するとき0

p will be 2000 and j will be 2000. 

は、そのようにあなたは私と0と2

+4

*アドレスは通常16進数です。 。何? –

+1

アドレスは、通常、16進数で表されます。例えば、1MBのRAMは00000HからFFFFFHまでのアドレスを持っています。 – Arvindsinc2

+6

アドレスは、現時点では通常は*便利*と表されます。 –

1

限り私ができるようになり、jの値を取得しますこれは非常に簡単です。

ijという変数へのポインターを、fに渡します。次にポインタpをポインタqと同じアドレスに設定すると、pは変数jを指します。間接演算子を使用してp(アクセスj)を逆参照し、その値を2に変更します。したがって、iは0のままになり、結果は0, 2になります。

ここにはガベージ値が存在する理由がわかりません。すべてp = qは、利用可能なパラメータを使用してpqjを指しているので、関数内でiにアクセスすることは不可能です。

したがって、iに変更されていません。オリジナルの定義です。あなたはそれを任意の数に定義することができ、それはmainに同じままです。

0

pはiのアドレスを指します。qはjのアドレスを指します。

p = qは、pが、qがqのアドレス、すなわちjのアドレスを指すことを意味する。

* p = 2は、pが指し示すアドレスに格納された値が2、すなわちj = 2であることを意味します。

したがって、iは以前のもの、つまりi = 0およびj = 2です。

関連する問題