重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

void型のfunc( )に二次元配列のポインタを渡したいのですが、下記の記述で渡すにはどのように関数を定義すれば良いでしょうか?
int *p
int tbl[3][3];
*(int (**)[3])&p = tbl;
func( );

A 回答 (2件)

int [3][3] 型を受け取りたいなら単純に


void func(int t[3][3])
 でいいのでは?
 表記が違うだけで、以下の2つも同じです
void func(int t[][3])
void func(int (*t)[3])
 呼び出す側は
func(tbl);
 でできます。


いろんな大きさの二次元配列(正確には、配列の配列)を使いたいから[3]と指定できない。
だからint * としてアドレスを渡して、大きさは別の引数で指定したい。

という話なら、そのまま
void func(int * q,int rmax,int cmax)
とか宣言すればいいだけです。

呼び出し側は
/* コンパイル時に警告(warning)が出るけど動作する */
func(tbl,3,3);

/* 配列を引数で渡す=先頭のアドレスを渡す という(隠れた)ルールを明示的に表記する */
func(&(tbl[0][0]),3,3);

/* 型をキャストしても、アドレス自体は変化しない */
func((int *)tbl,3,3);



> *(int (**)[3])&p = tbl;

指定の型のポインタにキャスト→ * をつけて実体へアクセス
というのは、テクニックとしてはありだし
/* 組込みとかでは
*((char *)0x0120) = 0xf0 ;
のように intでアドレスを直接指定→ポインタにキャスト→ * をつけて実体へアクセス→書き込み とすることがあります。
*/
int tbl4[4][4] ;

*(int (**)[3])&p = tbl4;
としようとしたら警告になるので間違い防止に使えなくはないです。

ですが、こんなややこしく書かなくても、同じことができますし、
下記のようなものの方が普通に使われています。

/* コンパイル時に警告(warning)が出るけど動作する */
p=tbl;

/* 先頭のアドレス という内容を明示的に表記する */
p=&(tbl[0][0]);

/* 型をキャストしても、アドレス自体は変化しない */
p=(int *)tbl;
    • good
    • 0

「二次元配列のポインタ」ってなに?



あと, なんでこんなバカなことをしなきゃならないの?
    • good
    • 0

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