user-0 提问: 三个关于c语法的问题，谢谢

回复:
user: user-1
content: 学然后知不足。

user: user-0
content: 还有大家能告诉我下 void * p.........和（void *）p..........的区别吗

user: user-2
content: 1.2.4）补充一下,函数指针变量的声明。    typedef int32_t (*a)(void);//定义 a ，a 这个名字，就是函数指针 int32_t (*)(void) 这种类型。    int32_t (*pa)(void); //直接声明函数指针变量。    a pa;                //用定义的类型名 a ,声明函数指针变量。

user: user-2
content: 1）要结合 typedef 关键字，和函数指针的概念看 1.1）typedef 用于给现有的类型，定义一个新名字。  typedef int32_t (*a)(void); //给函数指针类型，int32_t (*)(void)定义一个名字 a; 1.2)函数是有类型的     1.2.1) 函数大都有一个返回值，这个返回值（如果有的话），是有类型的     1.2.2) 函数大都有一些参数，每个参数也是有类型的。     1.2.3）函数的类型，            a) 包涵了它的返回值类型(0～1个返回值类型);               无返回值视作返回void 类型            b) 参数个数(0~n个参数);               无参数参数表,可能会写上 void,表示无参数.            c) 每个参数的类型(如果有参数)。            这些全都相同的，视为一个类型的函数。      1.2.4）指向某一类型函数的指针，就是该类型的函数指针。      函数有一个地址，所以，可以用，表示地址类型的，数据（指针），表示函数地址。      这个，表示函数地址的，数据类型，就是函数指针类型。       函数指针类型的数据定义,声明，赋值,调用函数      如下       a) int32_t (*pa)(void); //声明pa 是一个函数指针，类型为 int32_t (*)(void)           //该类型的指针，指向一个，返回值类型为int32_t，无参数的函数。      b)      int32_t fun(){return 0;}; //定义一个函数fun,返回值类型为int32_t，无参数.         int32_t (*pa)(void) = fun; //定义pa 是一个函数指针，类型为 int32_t (*)(void),用fun初始化         int32_t v;         pa = fun  ;//用函数(地址),给函数指针赋值         pa = &fun  ;//用函数地址,给函数指针赋值,有人认为这样更明确。         fun(); //函数调用，忽略返回值。                  pa();  //函数调用，通过函数指针，调用函数，忽略返回值。         (*pa)(); //函数调用，通过函数指针，调用函数，忽略返回值。有人认为这样更明确。         v = fun(); //函数调用，用返回值，给变量v赋值。这是包含，函数调用表达式的，赋值表达式。         v = pa(); //函数调用，通过函数指针，调用函数,                   // 用返回值，给变量v赋值。这是包含，函数调用表达式的，赋值表达式。                   // 函数用函数指针表示。                   v = (*pa)(); //函数调用，通过函数指针，调用函数,                   // 用返回值，给变量v赋值。这是包含，函数调用表达式的，赋值表达式。                   // 函数，用函数指针的，解引用，表示。                    // 有人认为这样更明确。          1.3） 给函数指针定义一个名字，并使用      typedef int32_t (*a)(void); //给函数指针类型，int32_t (*)(void)，定义一个名字 a;     int32_t fun(){return 0;}; //定义一个函数fun,返回值类型为int32_t，无参数.     a pa =fun; //定义一个a 类型变量，初始化为fun                //a类型就是 int32_t (*)(void)这是一个,                //返回值类型为int32_t，无参数的，函数指针类型。     pa();//     printf("%d\n",pa()); 通过a类型指针pa， 调用函数fun，并输出返回值。  2）a->b->c 这个只是指向运算符（->） 的连续使用，准确的说不是一种调用。 这个可以看成这样 (a->b)->c; 可以理解成这样： (* ((*a).b) ).c

user: user-2
content: 引用 3 楼 jerry_dqh 的回复:3也不能算偏！基础没有看啊 3）应该有点偏的。 理由如下： a) 很多入门书（可能很垃圾）不会讲续行符的，毕竟这不是一种运算符，也不是普通的分隔符。    多半都是用在宏定义的地方。 b)虽然，续行符,可以用在任何其他地方，基本上，别的地方都不会用续行符。 因为通常来说，不用续行符，和使用续行符，没有多大区别，除非用于宏定义。  c)相信，没有几个人，在非宏定义中，使用续行符。   所以，有些入门书不讲续行符，也是有谅可原的。

user: user-0
content: 我把c语言的基础学习篇都看了好几遍了，是不是得看看一些提高的书？大神们能方便推荐下不，我现在看的c语言大全目前还没有看到上面的答案

user: user-3
content: 引用 4 楼 u013410394 的回复:谢谢大神，你已经讲得很详细了，可是我还得细细想想，第一个和第二个还不是特别懂，第二个的a->b->c这样死连续调用吗 是的,a->b的返回值在调用c

user: user-0
content: 谢谢大神，你已经讲得很详细了，可是我还得细细想想，第一个和第二个还不是特别懂，第二个的a->b->c这样死连续调用吗

user: user-4
content: 3也不能算偏！基础没有看啊

user: user-2
content: 1）定义函数指针类型 a，即给函数指针类型 int32_t (*)(void) 类型起个名字，叫做 a;    这个看任何一本C语言的书，就知道了。    typedef int32_t (*a)(void);      int32_t fun(){return 0;};    int main(){    a *pfun = fun; //这是初始化a 类型指针    printf("pfun() = %d",           pfun()//这是通过函数指针调用函数。           );     return 0;         } 2）这是指向运算符-> ; c->a 相当于 (*c).a ，这个看任何一本C语言的书，就知道了，前者是后者的简化写法，后来就固定为一个运算符了。   3)  \ 是续行符 ，表示这行代码没结束，下一行的和这一行，实际是同一行代码。 PS： 只有3）比较偏僻，1）2）只要看书能够知道。

user: user-0
content: 大神们求教，分虽然不多，但是心意诚啊，谢谢大家