char * 型のバッファーを動的に割り当てる場合、および特定の型にキャストする場合は、次を使用する必要があります。
reinterpret_cast<int *>(char *)
また:
static_cast<int *>(static_cast<void *>(char *))
なぜ?
これ*pk = new int(2);
はpk
代わりにする必要があります*pk
pointer を宣言した後int * pointer
、すべての参照point
はアドレスを参照し、すべての参照*pointer
はアドレスに含まれるものを参照します。デフォルトでは、ポインターは有効なメモリ位置を指していないため、有効なアドレスを割り当てるか、 を呼び出す必要がありますnew
。これが、 を書き込むときにpk = &k
セグメンテーション違反が発生しない理由です。これは、有効なメモリ位置を指すpk
のアドレスが含まれているためです。k
*
ポインターの構文は、主に使用方法によって複数の意味を持つ可能性があるため、少し混乱する可能性があります。簡単な説明は次のとおりです。
*
は、ポインター (つまりint * pk
) を宣言していることを意味します。*
は、乗算の記号 (つまり4 * num
) があります。*myPointer
、 または(*mypointer)
)。はアドレスを返すため、 が指す値の代わりに にnew
アドレスを割り当てています。pk
pk
ポインタを初期化する場合は、new
ステートメントで宣言します。このような:
int * pk = new int;
ただし、自己完結型のポインターと値を宣言するコンパイル時の機能はありません。最も近いのは、これまで行ったように別の変数を宣言し、その変数のアドレスでポインターを初期化することです。このような:
int num = 43;
int * p = #
統一された変数を使用します: http://en.wikipedia.org/wiki/Uninitialized_variable
int* pk; // declare variable `pk` of type `int*` but do not initialize it
*pk = 2; // use unitialized variable. `*` is dereference operator. Seg fault
int k; // declare variable `k` of type `int`, not initialized
pk = &k; // initialize variable `pk` with address of variable `k`
*pk = 3; // use initialized variable. Ok now
pk
はポインタで、*pk
はそれが指す値です。
コードを次のように変更します。
int* pk = new int;
pk = reinterpret_cast<int*>(2);
pk
右辺に代入するとき*pk
は、整数でなければならないため、ポインターでなければなりません。
ポインタを値で初期化するにはどうすればよいですか?
あなたはそうしない。それがポインタを持つことのポイントです。値で初期化しません。変数addressで初期化します。
それを段階的に分析しましょう:
int* pk;
ポインターがあり、初期化されていないため、役に立たないよりも悪いです。
int* pk = nullptr;
少なくとも、if
何かを指している場合は、ステートメントで確認できます。
if(pk)
{
//do operations on pointed value *pk
}
else
{
//Houston, we have a problem
}
今のところ、これらの操作は意味がありません
*pk = 2; //you haven't pointed with pk to anything
*pk = reinterpret_cast<int*>(2); //????? *pk is int, and right-hand side is int*. What do you expect to do with it?
このコードは機能します
int k;
pk = &k;
*pk = 3;
実際に pk を意味のあるものに向けたからです。
int* pk = nullptr;
ここでは、pk が an へのポインタであることを宣言していますint
。
*pk = new int(2);
isの型と*pk
isint
の戻り値の型。new int(2)
int*