ページ 11

2次元のポインタ配列

Posted: 2007年7月15日(日) 19:29
by テオリア
再度よろしくお願いいたします。

int *pt[5][3]

上記の二次元ポインタ配列を関数に渡す(実引数)にはどうしたらよいのでしょうか?

Re:2次元のポインタ配列

Posted: 2007年7月15日(日) 21:32
by box
ちょっとした例です。
func()は、列の数が3である行列を受け取れます。
行の数は、引数で与えます。


#include <stdio.h>
#include <stdlib.h>

#define M1 (5)
#define M2 (10)
#define N  (3)

void func(int *(*p)[N], int m)
{
	int i, j;
	for (i = 0; i < m; i++) {
		for (j = 0; j < N; j++)
			printf("%10d", *p[j]);
		putchar('\n');
	}
	printf("\n\n");
}

int main(void)
{
	int *pt1[M1][N], *pt2[M2][N], i, j;
	
	for (j = 0; j < N; j++) {
		for (i = 0; i < M1; i++) {
			pt1[j] = (int *) malloc(sizeof(int));
			if (!pt1[j])
				fprintf(stderr, "out of memory\n"), exit(1);
			*pt1[j] = i * 100 + j;
		}
		
		for (i = 0; i < M2; i++) {
			pt2[j] = (int *) malloc(sizeof(int));
			if (!pt2[j])
				fprintf(stderr, "out of memory\n"), exit(1);
			*pt2[j] = i * 10000 + j;
		}
	}
	
	func(pt1, M1);
	func(pt2, M2);
	
	for (j = 0; j < N; j++) {
		for (i = 0; i < M1; i++)
			free(pt1[j]);
		for (i = 0; i < M2; i++)
			free(pt2[j]);
	}
	
	return 0;
}

Re:2次元のポインタ配列

Posted: 2007年7月15日(日) 23:07
by YuO
> 上記の二次元ポインタ配列を関数に渡す(実引数)にはどうしたらよいのでしょうか?

素直にそのまま書けばよいです。
つまり,
void func (int *arg[5][3]);
とでもしておけば,ptをそのまま渡せます。

Re:2次元のポインタ配列

Posted: 2007年7月16日(月) 00:02
by テオリア
boxさん、YuOさん、回答ありがとうございます。

無事できました。