110 识别复杂的声明

#include <stdio.h>
#include <assert.h>

typedef struct tagT {
    int a;
} T;

int f1(T *p) {
    p->a++;
    return 0;
}

int main(int argc, char *argv[])
{
    T t = { 0 }, *pt = &t; 

    typedef T *T01[5];
    T01 t01;
    t01[0] = pt; 
    t01[0]->a++;
    assert(t.a == 1); 

    typedef T *T02;
    T02 t02 = &t; 
    t02->a++;
    assert(t.a == 2); 

    typedef T **T03;
    T03 t03 = &pt;
    (*t03)->a++;
    assert(t.a == 3); 

    typedef int (* T04)(T *); 
    T04 t04 = f1; 
    t04(pt);
    assert(t.a == 4); 

    typedef int (* T05[5])(T *); 
    T05 t05;
    t05[0] = f1; 
    t05[0](pt);
    assert(t.a == 5); 

    return 0;
}