char filename[6][適当な大きさの数字];
for ( i = 0; i < sizeof(filename)/sizeof(filename[0]); ++i ) {
scanf("%s", &filename[i][適当な大きさの数字]);
関数(&filename[i][適当な大きさの数字]);
}

void 関数(/* const */ char * filename){
fp=fopen(filename,"r");

以下は参考程度に、配列の配列(通称、多次元配列)を関数に渡すとき
void 関数(char filename[][適当な大きさの数字]){
/* または、void 関数(char *filename[適当な大きさの数字]){ */
/* または、void 関数(char (*filename)[適当な大きさの数字]){ */
fp=fopen(&filename[i][適当な大きさの数字],"r");
関数側での使い方は、いろいろある。が、適当な大きさの数字を固定しないといけないので、あまり使われない。
構造体に入れて渡したり、要素数を渡すことが多い。
int foo(foo_t **ptr_to_ptr, size_t column, size_t row);みたいにね。