5

整数変数にポインタを割り当てることはできますか?次のように。

int *pointer;
int array1[25];
int addressOfArray;

pointer = &array1[0];

addressOfArray = pointer;

このようにすることは可能ですか?

4

5 に答える 5

4

いいえ、整数にポインタを割り当てることは無効です。これは、代入演算子(C99、6.5.16.1p1)の制約違反です。コンパイラーは、整数割り当てへのポインターを使用してプログラムを変換することを拒否する権利を持っています。

于 2012-05-07T20:58:39.570 に答える
3

明示的なキャストなしではありません。

addressOfArray = (int) pointer;

この警告もあります:

6.3.2.3ポインタ
...
6任意のポインタ型を整数型に変換できます。以前に指定された場合を除き、結果は実装によって定義されます。結果を整数型で表現できない場合、動作は未定義です。結果は、整数型の値の範囲内である必要はありません。

したがって、結果が意味のある整数値であるとは限りません。

于 2012-05-07T21:47:11.880 に答える
1

これは、組み込みプログラミングで頻繁に行われますが、いくつかの注意点があります。

  • 操作には(ほとんどの場合)キャストが必要であり、
  • 一般に、オペレーティングシステムなしで作業しているか、RTOSと非常に緊密に連携していることを意味します(つまり、ドライバーレベルの開発)
于 2012-05-07T21:06:59.803 に答える
1

いいえ。

「int」変数に「pointertoint」値を割り当てようとしています。確かにコンパイラの警告が表示されます。あなたができること:

int *pointer;
int array1[25];
int *addressOfArray;

pointer = &array1[0];
//The following commented lines are equivalent to the pointer assignment above and are also valid
//pointer = array
//pointer = &array[0]

addressOfArray = pointer;

これは浅いコピーとして知られています。概念にまだ精通していない場合は、それを読むことを強くお勧めします(Googleの「ディープコピーとシャローコピー」)。

于 2012-05-07T21:08:26.537 に答える
0

あなたはこのようにそれを行うことができます:

memcpy(&addressOfArray, &pointer, sizeof(int));

これは、基になるバイトを直接コピーしてキャスト演算子に取って代わりますが、システムでそれを確実に知っている場合を除いて、絶対にお勧めしませんsizeof(int) == sizeof(int *)

于 2012-05-07T21:04:28.783 に答える