#include <stdio.h>
#define UNVAL -1
#define MAX_X 10
#define MAX_Y 4
void print( int a[MAX_Y][MAX_X] ){
int i,j;
for(i=0;i<MAX_Y;i++){
for(j=0;a[i][j]!=UNVAL;j++){
printf("a[%d][%d]=%2d ", i
, j
, a
[i
][j
]); }
}
}
// データの無効値を作っておいて、それを配列の終わりとするやり方
void func1(void){
int a[MAX_Y][MAX_X]={
{1,UNVAL},
{2,3,UNVAL},
{4,5,6,UNVAL},
{UNVAL},
};
print(a);
}
// ・ポインタの配列を作り、ローカル変数の一次元配列のアドレスを記憶する。
// 配列の長さがバラバラなので最後は無効値が必須
void func2(void){
int a1[]={10,UNVAL};
int a2[]={20,30,UNVAL};
int a3[]={40,50,60,UNVAL};
int *p[]={a1,a2,a3};
int i,j;
for(i=0;i<sizeof(p)/sizeof(p[0]);i++){
for(j=0;(p[i])[j]!=UNVAL;j++){
printf("a[%d][%d]=%2d ", i
, j
, (p
[i
])[j
] ); }
}
}
int main(void) {
func1();
func2();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFVOVkFMIC0xCiNkZWZpbmUgTUFYX1ggMTAKI2RlZmluZSBNQVhfWSA0CnZvaWQgcHJpbnQoIGludCBhW01BWF9ZXVtNQVhfWF0gKXsKCWludCBpLGo7Cglmb3IoaT0wO2k8TUFYX1k7aSsrKXsKCQlmb3Ioaj0wO2FbaV1bal0hPVVOVkFMO2orKyl7CgkJCXByaW50ZigiYVslZF1bJWRdPSUyZCAiLCBpLCBqLCBhW2ldW2pdKTsKCQl9CgkJcHJpbnRmKCJcbiIpOwoJfQp9CgovLyDjg4fjg7zjgr/jga7nhKHlirnlgKTjgpLkvZzjgaPjgabjgYrjgYTjgabjgIHjgZ3jgozjgpLphY3liJfjga7ntYLjgo/jgorjgajjgZnjgovjgoTjgormlrkKdm9pZCBmdW5jMSh2b2lkKXsKCWludCBhW01BWF9ZXVtNQVhfWF09ewoJCXsxLFVOVkFMfSwKCQl7MiwzLFVOVkFMfSwKCQl7NCw1LDYsVU5WQUx9LAoJCXtVTlZBTH0sCgl9OwoJcHJpbnQoYSk7Cn0KCi8vIOODu+ODneOCpOODs+OCv+OBrumFjeWIl+OCkuS9nOOCiuOAgeODreODvOOCq+ODq+WkieaVsOOBruS4gOasoeWFg+mFjeWIl+OBruOCouODieODrOOCueOCkuiomOaGtuOBmeOCi+OAggovLyAgIOmFjeWIl+OBrumVt+OBleOBjOODkOODqeODkOODqeOBquOBruOBp+acgOW+jOOBr+eEoeWKueWApOOBjOW/hemgiAoKdm9pZCBmdW5jMih2b2lkKXsKCWludCBhMVtdPXsxMCxVTlZBTH07CglpbnQgYTJbXT17MjAsMzAsVU5WQUx9OwoJaW50IGEzW109ezQwLDUwLDYwLFVOVkFMfTsKCWludCAqcFtdPXthMSxhMixhM307CglpbnQgaSxqOwoJZm9yKGk9MDtpPHNpemVvZihwKS9zaXplb2YocFswXSk7aSsrKXsKCQlmb3Ioaj0wOyhwW2ldKVtqXSE9VU5WQUw7aisrKXsKCQkJcHJpbnRmKCJhWyVkXVslZF09JTJkICIsIGksIGosIChwW2ldKVtqXSApOwoJCX0KCQlwcmludGYoIlxuIik7Cgl9Cn0KCmludCBtYWluKHZvaWQpIHsKCQoJZnVuYzEoKTsKCWZ1bmMyKCk7CgkKCXJldHVybiAwOwp9Cg==