プロが教えるわが家の防犯対策術!

2次元配列 A[N][2]へのポインタ t2 に1次元配列のポインタ p を代入するときの型変換、教えて下さい。

-----------
int intBuf[1000];
int intBuf2[10][2];
int *t1,(*t2)[2];

int main(void)
{
 int i,j,*p;
 p = intBuf;
 t1=p; p+=20;    // 20個分の領域確保
 for(i=0; i<20; i++)
  t1[i]=0;

 t2=p; p+=25*2;      // 25*2個分の領域確保<-- 警告 W8075 : 問題のあるポインタの変換
// t2=(int**) p; p+=25*2;  // 試してみたがエラー
// t2=(int*[2]) p; p+=25*2;
// t2=((int*)[2]) p; p+=25*2;
// t2=(int(*[2])) p; p+=25*2;
 for(i=0; i<25; i++) {
  t2[i][0]=i;
  t2[i][1]=0;
 }
 
 t2 = intBuf2;  // すでに確保された領域をポイント、エラーなく代入できる
 for(i=0; i<10; i++) {
  t2[i][0]=i;
  t2[i][1]=0;
 }

A 回答 (2件)

t2 を


int (*t2)[2];
と定義しているのだから, その型は
int (*)[2]
になる (「t2」をなくしただけであることに注意). だから p をそれに変換したければ
(int (*)[2])p
とすればいい. あるいは
typedef intarray[2];
という typedef があれば (intarray *)p でも可.

なんだけど, 実は C なら
t2 = p;
でも (処理系によっては警告を出すかもしれないが) いけてしまう.
    • good
    • 0
この回答へのお礼

回答ありがとうございます
>その型は
>int (*)[2]
>になる (「t2」をなくしただけであることに注意).

確かに! 
t2=(int*[2]) p;でエラーになってパニックになってました。

>実は C なら
>t2 = p;
>でも (処理系によっては警告を出すかもしれないが) いけてしまう.
おっしゃる通りです。
実は動くけど、「警告 W8075 : 問題のあるポインタの変換」が出るのが気持ち悪いので質問しました。

お礼日時:2022/03/29 11:37

未整地の領域に対して無理やり自己定義した二次元配列を当てはめて、配列形式で扱いたいってことですかね。



手元のgccでは、少なくとも下記の記述だとエラーは出ませんでした。
t2=(int(*)[2])p;
これだと、intBuf[20]が0、21が0、22が1、23が0・・・68が24、69が0になります。やりたいことはこんな感じでしょうか?
    • good
    • 0
この回答へのお礼

応答ありがとうございます

t2=(int(*)[2])p;

なるほど、
t2=(int*[2]) p;ではだめですが、*を()で囲めばよかったのですね!

助かります。

>やりたいことはこんな感じでしょうか?
そうです。このサンプルプログラムは、
0,0,0,1,0,2,0,3,...と並んでいる1次元データを2次元配列データとして扱いたい、あるいはその逆で、2次元データを1次元データとして扱いたいということです。

お礼日時:2022/03/28 16:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!