c++ - 違い - 配列へのポインタ




単純なポインタの初期化 (5)

Cにはnullキーワードはありません(少なくともANSI C99では)。 a)またはc)を使うことができます。

c)nullでポインタを初期化しない場合は、ローカル変数のアドレスで初期化します。

私はポインタを使用していましたが、整数ポインタをどのように初期化できるかを素早く確認したいだけです。

a) int *tmpPtr = 0;

b) int *tmpPtr = null;

c) int a = 0;
   int *tmpPtr = &a;

EDIT

これまでのすべての答えに感謝します。 面白いのは、もし私がポインタを次のようにintitalizeすると、mem :: copy操作はうまく動作するということです。

int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));

しかし、私がこれを好きなら、

int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));

mem :: copy中にクラッシュする

奇妙な!


EDITであなたの質問に返信してください:

  • これを行うとき:

    int tmp = 0;
    int *tmpPtr = &tmp;
    Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
    

tmpPtrは変数tmpのアドレスを指しており、 stack内にありstack 。 また、tmpPtrが指す "安全領域"は、 tmpのサイズ(一部のマシンでは4、その他では2)です。 sizeof(int)バイト以上をtmpPtrにコピーすると、スタックがクラッシュする危険性があります。

  • これを行うとき:

    int *tmpPtr = 0;
    Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
    

tmpPtrの値は0なので、 セグメント障害が発生します。 これは、オペレーティングシステムによって提供されるメモリ保護メカニズムです。 たとえば、4K未満の仮想アドレスを書き込むことはできません。


ヌルでないことを除いて、それらの方法のいずれかを実行できます。 私はint * p = 0を好む。 over int * p = NULL;

私はいくつかの混乱を排除するために、int * p = 0に設定するかMyObject * p = 0に設定します。 同じことになります。ヌルポインタは、技術的には未定義の動作ですが逆参照しようとすると、通常はプログラムをクラッシュさせます。 実際にポインタを0に設定された整数を指すように設定しているため、Cでの例は他の例とは異なります。

int *pNull = 0;
int c = *pNull;  // Undefined behavior.  Most likely crashing your program!

int a     = 0;
int *pInt = &a;

int x = *pInt;   // x equals 0 

a = 10;
int y = *pInt;   // y equals 10


ヌルポインタ定数で何も指していないポインタを初期化します。 値が0の定数式はすべてNULLポインタ定数として機能します。 C では、マクロは慣例によって使用されます。


簡単な質問はうまくいきますが、私はSOが単なるエリートではなく、あらゆるレベルのためのものであることがうまく確立されていると思います。

Cでnullはありません(自分で定義しない限り)。 ヌルポインタに初期化するには、次の2つの方法があります。

int *p = 0;
int *p = NULL;

その後pを参照解除すると、アクセス違反が発生する可能性が高くなります(標準に従って未定義の動作だと思うので、実際には、宇宙の完全消滅を含む何かが起こる可能性があります。うまく動くが、私はそれに頼るつもりはない)。

実整数へのポインタを取得するには、次のようにします。

int a = 7;
int *p = &a;

アドレス演算子を使用します。

あなたの編集を再、それは全く変わっていない、あなたはそれを視覚化する必要があります。 すべての変数がメモリ位置100から作成され、整数とポインタが両方とも4バイトの長さであると推測しましょう。 あなたの2つの状況を最も簡単な形にすること:

                                  int x = 2;
int *px = 0;                      int *px = &x;

         +-----+                          +-----+
px(100): |   0 |                  x(100)  |   2 |
         +-----+                          +-----+
                                  px(104) | 100 |
                                          +-----+

次に、コマンドを実行します

*px = 7;

px指される変数を変更しようとしました。

左側では、メモリ位置0に値7を書き込もうとします。これは悪いことです。 ごくわずかなシステムでクラッシュせずに行うことができますが、HP-UXの一部のバージョンでは問題なく動作します。

右側は何起こるべきかです。 pxから取り上げられた値は100なので、値7はそのメモリ位置に書き込まれ、意図したとおりにx変更されます。

私はしばしば、ルーベンスやボッティチェッリではないので、基本的なアスキーアートアートでさえも絵を見つけることができます。 うまくいけばそれはあなたのために少しそれをクリアしました。





pointers