ウェブで検索しましたが、信頼できる答えが見つかりませんでした。そして、何が
someclass* ptr = 1;
char* charptr = 2;
またはそれらを他の整数平均に割り当てますか?
ポインター (ネイティブ データ ポインターとクラス ポインター) を使用する前に初期化しないとどうなりますか?
ポインターを0
に設定することは、 に設定することと同じNULL
です。ただし、これは定数式 0
、つまりコンパイル時の値がゼロの場合にのみ当てはまります。ポインターを実行時のゼロ値に設定しようとしても、null ポインターが生成されるとは限りません
int *pi = 0; // Initializes a null pointer
char *pc = 2 - 2; // Initializes a null pointer
short *ps = sizeof *pc - 1; // Initializes a null pointer
int x = 0;
double *pd = (double *) x;
// Implementation-defined, not guaranteed to produce a null pointer
問題をより詳細に調べることができますC FAQ
質問の 2 番目の部分に答えるには:
他の整数 (リテラル/定数 0 以外) をポインターに代入することはできません。初期化 (または代入) はどちらもコンパイルされません。これは C と C++ の両方で違法ですが、C コンパイラは歴史的にこの点に関してより許可しており、コードのコンパイルを拒否する代わりに警告を返します。
また、C++ 言語では、クラス型へのポインターの処理方法に違いはありません。クラス型へのポインターは引き続きスカラー型と見なされ、基本型へのポインターと同じように動作します。
はい、C++ では NULL は 0 と定義されています。ポインターを他の小さな整数値に設定すると、コンピューターのメモリの一部 (おそらく違法) を指すことになります (ただし、NULL ポインターとは見なされません)。
グローバル ポインタを初期化しない場合、プログラムの開始直前にゼロ (NULL) に設定されます。スタック上で宣言されたポインター変数を初期化しない場合 (つまり、関数またはメソッド内で)、それらにはガベージが含まれます。同様に、動的に割り当てられたポインターの内容、またはデータ メンバーとしてオブジェクトに含まれるポインターの内容にも、事前定義された値はありません。calloc()
一部のコンパイラには、C の関数が raw メモリに対して行うように、動的に割り当てられたメモリの要求を最初にゼロにする拡張機能があります。