2次元配列で参った続き

#include <stdio.h>

//void print3x3Matrix(const long m[][3])
void print3x3Matrix(const long (*m)[3])
{
	printf( "--- matrix ---\n" );
	printf( "%3ld, %3ld, %3ld\n", m[0][0], m[0][1], m[0][2] );
	printf( "%3ld, %3ld, %3ld\n", m[1][0], m[1][1], m[1][2] );
	printf( "%3ld, %3ld, %3ld\n", m[2][0], m[2][1], m[2][2] );
}

int main(int argc, char *argv[])
{
	long matrix[][3] = {
		{  0,  1,  2 },
		{ 10, 11, 12 },
		{ 20, 21, 22 }
	};
	print3x3Matrix( (const long (*)[])matrix );
	return 0;
}

結局、分かったことはこんな感じ。
引数の書き方として、3行目と4行目はどちらも同じということ。
関数を呼ぶときに、const付きでキャストしてあげれば、
警告はでないということ。
vcだとでないけど、gccだと出るということ。
(確かに、普段はVC9だけど見た事がない。)

char **をconat char **を引数に取る関数に渡しても、
同様の警告がでるらしい。
詳しくは「C言語 FAQ 日本語訳」を読むと良いと思う。
(リンクしても良いのか判断しかねたので、検索してください。)

という訳で、Cコンパイラさんは、ルールにのっとって警告しているだけで、
この点に関しては、ユーザーの判断でキャストするのが良さそうです。

ちなみに、long (*m)[3]とlong *m[3]は意味が違うから気を付けてね。
おしまい。

Leave a Comment