web-dev-qa-db-ja.com

配列へのポインターのキャスト(int *からint [2])

Int *をint [x]にキャストまたは変換するにはどうすればよいですか?

例として、ポインターint* c = new int[x]を配列int b[2]にキャストしようとしました

int b[2] = { 2, 3 };
int* c = new int[b[1]];

c[0] = b[0];
c[1] = b[1];
c[2] = a;

まず、ポインタをループできるおよび配列であることを知っています。したがって、[]演算子を使用してポインターを配列に変換し、ポインターと配列にインデックスを付けて、ポインター要素を配列要素に割り当てます(たとえば、arr[i] = p[i])。同じ結果がより少ないコード行で達成できるかどうかを知りたい。

私は自分でそれを理解しようと試みたので、何をどこに置こうとしているかを正確に知っていることを確認するための簡単なプログラムを作成しました。出力は次のとおりです。

Address of {type: int} &a =             0031FEF4; a = 1
Address of {type: int[2]} &b =          0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] =       0031FEE4; b[0] = 2
Address of {type: int[2]} &b[1] =       0031FEE8; b[1] = 3
Address of {type: int*} &c =            0031FED8; c = 008428C8
Address of {type: int*} &c[0] =         008428C8; c[0] = 2
Address of {type: int*} &c[2] =         008428D0; c[2] = 1

一度試してみて、いくつかのことを試したところを確認しました。最初に思いついたのは、2番目の要素のアドレスをポインターの割り当てに取得し、配列のメモリアドレスをそれに置き換えることでした(次のコードを参照)。私がやろうとしたすべてが最終的に失敗し、通常は構文エラーが発生しました。

これは私が試したものですこれが最も簡単な解決策になるので、私は本当にこれが機能することを望みます。

b = &c[1];

これは明らかに機能しませんでした。

編集:解決策:それをしないでください!それが必要へのポインタを作成する配列し、配列をポイントします。これは私が推測できるどんな目的にも意味がありません。詳細については、以下のrodrigoによる回答を参照してください。

22
Josh C

まず、bはポインターではなく配列であるため、代入できません。

また、配列型には何もキャストできません。ただし、配列へのポインターにキャストすることはできます。 CおよびC++では、配列へのポインターはかなり一般的ではないことに注意してください。ほとんどの場合、プレーンポインターまたはポインターツーポインターを使用し、ポインターツーアレイを使用しない方が良いでしょう。

とにかく、あなたが尋ねることは多かれ少なかれ行うことができます:

int (*c)[2] = (int(*)[2])new int[2];

ただし、typedefを使用すると簡単になります。

typedef int ai[2];
ai *c = (ai*)new int[2];

安全のために、削除は元のタイプを使用して行う必要があります。

delete [](int*)c;

あなたが楽しみのためにそれをするなら、それは素晴らしいことです。現実には、通常std::vectorを使用する方が適切です。

27
rodrigo

まず、Cスタイルの配列へのポインターのキャストは、一般的に非常に悪いの練習です。

ただし、一時配列( "rvalue array")をアドレス/ポインターにディケイできます。このようなものを書くだけです

#include <stdio.h>

int main()
{
    int *array  = (int[2]){1, 2};
    printf("%d", array[0]); /* array[0] contains 1 now */

    return 0;
} 

繰り返しますが、そうするときは、そのようなトリックの正当な理由があるはずです。

P.S。上記のコードは、最新のC++コンパイラではなく、C99/C11でのみ有効です。

0
Twissell