寛子の母祇子は素性がはっきりせず、母方の血統を重んじた当時身分低い女性から生まれたことは貴族社会において不利であったが、子女に恵まれなかった頼通にとっては待ちに待った娘であった。特に養女嫄子（後朱雀天皇中宮）が早世した後は、頼通はこの一人娘に皇太子誕生の命運を賭けて永承5年12月22日（1050年2月5日）後冷泉天皇に入内させ、さらに翌年2月13日（1051年3月27日）、皇后（皇后宮）に冊立する。既に中宮として章子内親王がいたが、通常ならば先立の中宮である章子を皇后宮、寛子を中宮とするところを章子の希望で章子は中宮のまま留め置かれ、寛子が皇后宮とされた。父関白の強力な後見を受けて、歌合を催すなど風流を好んだ寛子の御殿は非常に華やかであった。その様子は、寛子に仕えた女房下野の私家集『四条宮下野集』に記されている。しかし父頼通の多大な期待を背負い、素直な明るい気質で後冷泉天皇の篤い寵愛を受けたにもかかわらず、皇后寛子はついに子を産むことはなかった。治暦4年4月17日（1068年5月20日）、藤原歓子（叔父藤原教通の娘）の皇后（皇后宮）冊立を受けて皇后（中宮）に冊立。ここに史上唯一、三后が並立する事態となった。なお、皇后宮から中宮になったのは寛子ただ一人である。翌々日後冷泉天皇に先立たれた寛子は、同年12月に出家する。翌延久元年7月3日（1069年7月23日）皇太后、延久6年6月20日（1074年7月16日）太皇太后となる。彼女の晩年にあたる12世紀前半には、すでに摂関政治の栄華も過去のものとなっていたが、父頼通や伯母藤原彰子らその栄華の中心人物と直に接していた寛子は、藤原忠実（弟師実の孫）ら摂関家の人々から過去（摂関政治全盛期）の故実に通じた人として敬意が払われ、没後も「四条宮故実」として彼女による先例は重んじられた。忠実の言行を記した『富家語』や『中外抄』にも彼女の故事が登場している。大治2年（1127年）、92歳という高齢で宇治別宅にて崩御した。92歳という年齢は、昭和天皇の皇后である香淳皇后が2000年（平成12年）に97歳で死去するまで約870年もの間、皇后としては歴代最高齢記録であった。
static void upheap(double arr[], int n);static void downheap(double arr[], int n);static inline voidswap(double arr[], int a, int b){    double tmp = arr[a];    arr[a] = arr[b];    arr[b] = tmp;}voidheapsort(double arr[], int n_elems){    int i = 0;    /*     * arr の先頭から順に、ヒープを成長させる     *  0    1    2  | 3    4    5     * [  ] [  ] [  ]|[  ] [  ] [  ]     *    ヒープ     |   未処理の入力     *              ===>     * i は、ヒープ中の要素数であると同時に、未処理データの先頭を     * 指してもいる     */    /* 配列が全部ヒープに入れ替わるまで繰り返す */    while (++i < n_elems) {        /*         * 配列の先頭要素を、ヒープの最後に移動するわけだが、どちらも         * ちょうど同じ場所に最初からあるので、境界を移動させるだけでよい         */        /*         * arr[i] に、ヒープに新しく追加されたデータがあるものとして、         * 先頭から arr[i] までがヒープになるよう再構成する         */        upheap(arr, i);    }    /*     * arr の末端から順に、ヒープから取り出して並べる     *  0    1    2  | 3    4    5     * [  ] [  ] [  ]|[  ] [  ] [  ]     *    ヒープ     |   ソート済みの配列     *             <===     */    /* ヒープが全部配列に入れ替わるまで繰り返す */    while (--i > 0) {        /*         * ヒープの先頭要素を、配列に移動すると同時に、ヒープの最後の         * 要素を、ヒープの先頭に移動する swap         */        swap(arr, 0, i);        /*         * arr[0] に、ヒープの最後から移動されたデータがあるものとして、         * 先頭から arr[i - 1] までがヒープになるよう再構成する         */        downheap(arr, i);    }}/* * macros for heaptree * for 0 origin array */#define LEFT_CHILD(i)  (((i) + 1) * 2 - 1)#define RIGHT_CHILD(i) (((i) + 1) * 2)#define PARENT(i)      (((i) + 1) / 2 - 1)/* * arr[n] に、ヒープに新しく追加されたデータがあるものとして、 * 先頭から arr[n] までがヒープになるよう再構成する */static voidupheap(double arr[], int n){    while (n > 0) {        int m = PARENT(n);        if (arr[m] < arr[n]) {            swap(arr, m, n);        } else {            break;        }        n = m;    }}/* * arr[0] に、ヒープの最後から移動されたデータがあるものとして、 * 先頭から arr[n - 1] までがヒープになるよう再構成する */static voiddownheap(double arr[], int n){    int m = 0;    int tmp = 0;    for (;;) {        int l_chld = LEFT_CHILD(m);        int r_chld = RIGHT_CHILD(m);        if (l_chld >= n) {            break;        }        if (arr[l_chld] > arr[tmp]) {            tmp = l_chld;        }        if ((r_chld < n) && (arr[r_chld] > arr[tmp])) {            tmp = r_chld;        }        if (tmp == m) {            break;        }        swap(arr, tmp, m);        m = tmp;    }}