2017-02-19 19 views
4

これを行うための正確な構文について少し説明します。私はそのようなとして定義された1つの配列があります。C constの配列unsigned char [] []

const unsigned char ARR[SIZE][SIZE] = {...} 

をし、私は私がconst unsigned char ARR2[][SIZE][SIZE] = {ARR}const unsigned char* ARR2[SIZE][SIZE] = {ARR}を試してみた

ARR2[0] = ARR 

の効果に何かを行うことができますので、配列にそれを持ってしたいのですが、どちらも働いている人の誰かが、符号なし文字の定数2次元配列の定数配列を持つ正しい構文を指摘できますか?

+0

あなたが達成しようとしていることは不明です:あなたは 'ARR'とこの' ARR2'を使ってコードを投稿できますか? – chqrlie

+0

'[SIZE] [SIZE]'配列の配列や '[SIZE] [SIZE]'配列へのポインタの配列が必要なのですか? – Dolda2000

+0

つまり、 'ARR2 [0]'が 'ARR'を指すようにするのか、それとも' ARR'の内容で初期化された配列にするのですか? – Dolda2000

答えて

2

あなたはこれをしたいように、それが聞こえる

const unsigned char (* const ARR2[])[SIZE][SIZE] = {&ARR}; 

それはすべきおそらく、ARR[x][y]としてにアクセスするのにこの忌み嫌いを使用することはできませんが、(*ARR2[0])[x][y](または同等にはARR2[0][0][x][y])を行う必要があります。

ARR2ARR2[0] = ARRを割り当てることはできませんが、少なくとも警告を避けるためにはARR2[0] = &ARRを明示的に行う必要があります。その理由はARRは、その最初の要素へのポインタに退化ARR2[0]&ARRで得られるconst unsigned char (*)[SIZE][SIZE]を割り当てることを期待する一方、つまり、その値const unsigned char *は、&ARR[0][0]であることです。どちらの場合もポインタ値は同じですが、型は異なります。

+0

これは技術的には正しいですが、OPのスキルレベルよりも先のようです。実際、コンパイラ適合性テストのように見えます。 – chqrlie

+0

ええ、私はARR2を書くのが始まったときに、ちょっと混乱することに気付きました。私は配列の配列を持つ必要があり、それぞれの配列が移植性の理由から独自のヘッダーファイルを持つ必要がありました。 ここで何が起こっているのか分かります。配列を使用するたびにリファレンスに変換されるという誤った印象を受けたと思います。 – user2752635

+1

@ user2752635:わかりませんが、あなたのコメントからセルジオの答えまで、変数の初期化が変数割り当てと同じ(または少なくとも類似している)という誤った印象のように聞こえるかもしれません。真実。 – Dolda2000

-1

は、あなたが、これはことはできませんARR2が、それは最初の要素だとして配列ARRを保持できる配列になりたいけど、ことをあなたのコメントで述べたこの

const unsigned char (* ARR2)[SIZE] = ARR; 

を試してみてください。 ARRは配列であり、単項オペランドの場合は最初の要素である&sizeofの演算子であると予想されます。

+1

私はARRへのポインタを持っているつもりはありません。私は最初のインデックスがARRを指している配列を持つことを試みています。 – user2752635

+1

@ user2752635;答えを更新しました。 – haccks

1

代入演算子の左オペランドは算術、構造体/共用体、ポインタ型のいずれでもかまいませんが、配列は1つではありません。詳しくは、6.5.16.1 Simple assignmentを参照してください。

あなたのための唯一の方法はmemcpy()です。このようなものだ

const unsigned char ARR[SIZE][SIZE] = {...}; 
const unsigned char (*ARR2[])[SIZE][SIZE] = {&ARR}; 

あなたはARR2自体がconstになりたい場合は、::

haccks'答えにあなたのコメントから
+0

私は分かりません。 'const unsigned char ARR [SIZE] [SIZE] = {...}'はうまくコンパイルされます。私は自分のコードでARRを使うことができます。配列を何かに設定することは問題ではないが、問題は型付けである。 これはgccの機能かもしれませんが、私は間違いなくそのように配列を初期化できます。 – user2752635

関連する問題