5

ダブルポインター(ポインターへのポインター)を試していて、それを正しく理解したいと思っていました。私は次のコードを試していました

#include<stdio.h>

int main()
{
    int y = 5;
    int *p = &y;
    int *q = &p;

    printf("\n\n %p %p %p %p %d\n\n",q,&p,p,*q,*p);

    return 0;

 }

上記のコードでは、p は y を指すポインターであり、q は p を指すポインターです。何が起こるかを確認するためだけに、意図的にダブルポインター (**q) を使用していません。コンパイラは、互換性のないポインター型を示す警告を出しました。コードを実行したとき、q は p へのポインターであることを理解したので、p のアドレスが含まれていますが、*q は p に含まれる値、つまり y のアドレスを提供していません。むしろ、ジャンク値を取得しました。 . q を double ポインターとして宣言していないためですか?*q に対して奇妙な値が得られる理由を正確に説明できる人はいますか?

4

4 に答える 4

1

この行は正しくありません

 int *q = &p;

&p は、int (y) を指しているポインター (p) のアドレスです。

int (q) へのポインターに割り当てると、再解釈が行われます

*q は、p のアドレスを整数として解釈します。それは y (=5) の内容と同じではありません

于 2013-04-12T16:06:39.467 に答える
1

なぜ私が奇妙な値を取得しているのかを誰かが説明できます*qか?

いくつかの問題があります:

  • まず、 を使用し*qて、ポインターを として解釈しようとしていますint。これは無効です。
  • 次に、printf()書式指定子が 5 番目の引数の型と一致しません。

一部のプラットフォーム (これを入力しているコンピューターを含む) では、ポインターのint. あなたのコードを自分のコンピューターで実行すると、次のようになります。

0x7fff5ef94ad8 0x7fff5ef94ad8 0x7fff5ef94ae4 0x5ef94ae4 5

ここでは、64 ビットのポインタが 32 ビットに切り詰められていますint。したがって、ポインターの下部のみが表示されます。ただし、コードの動作は定義されていないため、他の方法で失敗した可能性があります。

于 2013-04-12T16:10:42.657 に答える