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アドレスを割り当てています。pkpk
ポインタを初期化する場合は、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の型と*pkisintの戻り値の型。new int(2)int*