ふむふむ

alias void (*Hoge)(int*);

void Foo(int *a)
{
    a = cast(int *)1;
}

void Piyo(Hoge a, int *b)
{
    a(b);
    printf("address: 0x%p\n", a);
}

void main()
{
    int a;
    printf("before %d\n", a);
    Piyo(&Foo, &a);
    printf("after %d\n", a);
}

aliasの部分をextern Cすると・・・

alias.d(21): function alias.Piyo (void(C *)(int*),int*) does not match parameter types (void(*)(int* a),int*)
alias.d(21): Error: cannot implicitly convert expression (& Foo) of type void(*)(int* a) to void(C *)(int*)

どうやら、extern Cが悪さをしているらしいな・・・orz
しかもafterの値が変わってない・・・というか、foo(&bar(argument))ってなカンジで渡せるのかと思ってたけど、違うんだね・・・

追記:これが関連してるのかも・・・

extern宣言
記憶クラス extern のつきで宣言された変数の領域は、 モジュール内には確保されません。 同じ名前で変数を定義した別のオブジェクトファイルを リンクする必要があります。 この機能の使いどころは、 C言語グローバル変数宣言の利用です。

http://www.kmonos.net/alang/d/declaration.html