&は結びついたオブジェクトのアドレスを与える。
すなわち
char a[]="276,逝ってよし";
だと
char (*p)[]=&a;
じゃないとだめなわけである。
このかっこは必要である、なぜなら
char *p[]=&a;
では文字を指すポインタの配列を宣言したことになるからである。

書き直したソースはこうなる
#include <stdio.h>
void a(char (*p)[])
{ printf("%s",*p); }
main()
{
char b[5000]={"aiueo"};
a(&b);
}