-2

誰かがここで何が起こっているのか詳しく説明してください。

int main()
{
    int **p = 0;
//p=?  and why| *p=?  and why|**p=? and why

    ++p;
//p=?  and why| *p=?  and why|**p=? and why

    printf("%d\n", p);
return 1;
}

出力:-

  • 4(なぜ?)
4

5 に答える 5

7

まず第一に、p整数へのポインタへのポインタです。

int **p = 0;

p= 0、*p=なし、**p=なし未満。

++p;

p = p+1と同じです。さらにintへのポインタへの1つのポインタのサイズを意味します。ポインタは基本的に、少なくともOSでは32ビット長(4バイト)です。p現在、0の後に4バイトを指します。の値p4です。

于 2011-09-15T09:47:30.837 に答える
6

pへのポインタへのポインタintです。これはに初期化されてい0ます。つまり、nullポインタです。

次に、メモリ内の次の連続するポインタを指すようにインクリメントさintれます。* プラットフォームではポインタのサイズが4バイトであるため、次のポインタはアドレス4になります。

次に、printfはポインタ値を整数として解釈するため、「4」を表示します。

*ただし、これは未定義の動作であることに注意してください。

于 2011-09-15T09:43:04.127 に答える
4

明らかです。intへのポインタ(intへのポインタへのポインタをint **p意味します)へのポインタがあり、実際にはアドレス0を保持しています。アーキテクチャでは、ポインタ自体の長さは32ビット(4バイト)であるため、インクリメントpするとp + 4、つまり0 + 4=4になります。

素敵なCの本を手に入れて、ポインタ演算について学びましょう。あなたはあなたの人生の残りの部分を喜ぶでしょう!:)

于 2011-09-15T09:42:40.833 に答える
3

++pは実際には未定義の動作ですが、実装で発生したように見えるのsizeof(int*)は4であり、nullポインタはアドレス0です。UBでない場合、ポインタの増分により、アドレスに次のサイズに等しいバイト数が追加されることを思い出してください。参照タイプ。したがって、型のnullポインタint**(したがって、referand型はint*)を取得してインクリメントすると、アドレスに到達することはそれほど驚くことではありません4。保証されているわけではありません。

%dフォーマットがanを予期しているときにポインタを渡すことintも未定義の動作ですが、との表現にintint**十分な互換性があり、実装のvarargs呼び出し規約はそれらを十分に同様に扱い、正常に出力されたよう4です。これは、が保証されていない実装にとってもそれほど驚くべきことでsizeof(int) == sizeof(int**)はありません。

もちろん、これは未定義の動作であるため、表示される内容については他にも考えられる説明があります。

于 2011-09-15T09:44:01.897 に答える
0

pはintへのポインタへのポインタです。そして、それは0、つまりNULLに初期化されます。

インクリメントすると、intへの次のポインタを指すようになります。これは32ビットシステムではたまたま4です。

于 2011-09-15T09:43:53.943 に答える