-1

char * 型のバッファーを動的に割り当てる場合、および特定の型にキャストする場合は、次を使用する必要があります。

reinterpret_cast<int *>(char *)

また:

static_cast<int *>(static_cast<void *>(char *))

なぜ?

4

5 に答える 5

5

これ*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 = &num; 
于 2013-06-03T23:36:06.390 に答える
1
  • ここで何が起こっているのか説明してもらえますか?

統一された変数を使用します: 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

逆参照演算子: http://en.wikipedia.org/wiki/Dereference_operator

于 2013-06-04T03:28:11.093 に答える
0

pkはポインタで、*pkはそれが指す値です。

コードを次のように変更します。

int* pk = new int;

pk = reinterpret_cast<int*>(2);

pk右辺に代入するとき*pkは、整数でなければならないため、ポインターでなければなりません。

于 2013-06-03T23:43:44.843 に答える
0

ポインタを値で初期化するにはどうすればよいですか?

あなたはそうしない。それがポインタを持つことのポイントです。値で初期化しません。変数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 を意味のあるものに向けたからです。

于 2013-06-04T00:12:48.670 に答える
0
int* pk = nullptr;

ここでは、pk が an へのポインタであることを宣言していますint

*pk = new int(2);

isの型と*pkisintの戻り値の型。new int(2)int*

于 2013-06-03T23:39:51.743 に答える