2次元配列を関数に渡す

なんか前にも似たようなこと書いた気がするけど、2次元配列を関数に渡す場合普通だったらポインタ配列を使うんだろうけど、

#include <stdio.h>
void foo1(int *data[],int row,int column){
	int i,j;

	for(i = 0;i < row;i++){
		for(j = 0;j < column;j++){
			printf("%d ",data[i][j]);
		}
		printf("\n");
	}
}

int main(int argc, char const* argv[])
{
	int data[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	int i;
	for(i = 0;i < 3;i++){
		pdata[i] = data[i];
	}
	foo2(pdata,3,3);
	return 0;
}

こうやればポインタ配列使わないでもいけるなと思った。

#include <stdio.h>

void foo2(int **_data,int row,int column){
	int i,j;
	int (*data)[row] = (int (*)[row])_data;

	for(i = 0;i < row;i++){
		for(j = 0;j < column;j++){
			printf("%d ",data[i][j]);
		}
		printf("\n");
	}
}

int main(int argc, char const* argv[])
{
	int data[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	foo1((int **)&data,3,3);
	return 0;
}

あれでもこれってgcc拡張だったような…


(追記)
ていうかgcc拡張使うんだったらこれでいけることを思いだした

void foo3(int row,int column,int data[row][column]){
	int i,j;

	for(i = 0;i < row;i++){
		for(j = 0;j < column;j++){
			printf("%d ",data[i][j]);
		}
		printf("\n");
	
}

int main(int argc, char const* argv[])
{
	int data[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	foo3(3,3,data);
	return 0;
}

まぁでも個人的ににはfoo(data,3,3);って指定したいかも…