zoukankan      html  css  js  c++  java
  • 我见过的最好的关于typedef函数指针声明的解说

    typedef函数指针的声明与其他类型的声明有所不同,主要遵守右左法则,具体的解释如下:

    1.1 解读的原则---右左原则:
    右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
    个人认为最开始应该是从需要定义的标识符开始阅读(当然有可能所有的需要定义的标识符都是在圆括号内的),因为一个声明中可能有多个标识符,但是未定义的标识符永远只有一个。
    注:函数的返回值不能是一个数组。数组的元素类型必须一样,同时他们占用的空间也必须一样,所以数组内不能存放函数。
    通过以下的例子讨论右左法则:

    int (*func)(int *p) ;
      首先找到未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型 的形参,返回值类型是int。
    int (*func)(int *p, int (*f)(int*));
      func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边有一个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int *)这样的形参,返回值为int类型,看一下func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。
    int (*func[5])(int *p);
      func右边是一个[ ]运算符,说明func是一个具有5个元素的数组,func左边有一个*,说明func的元素是指针,这里的*是修饰func[5]而不是func的,应为[]运算符的优先级比*高,所以func先与[]先结合。跳出这个括号,右边也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。
    int (*(*func)[5])(int *p);
      func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。
    int (*(*func)(int *p))[5];
      func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

    要注意有些复杂指针声明是非法的,例如:

    int func(void) [5];
      func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。
    int func[5](void);
      func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

  • 相关阅读:
    MVVM绑定 填坑,必须在与 DependencyObject 相同的线程上创建 DependencySource
    备份一个迭代查找TreeViewItem的辅助函数
    备份一个集合分组的算法
    备份一个有的时候,可能需要把其它exe或者dll包含在主程序中....
    wpf 代码判断当前是否在设计模式,兼容没有UI线程的限制
    wpf 打开输入法、禁用输入法
    xunit vs2019扩展
    .net core使用nacos作为配置中心
    使用skywalking跟踪你的请求
    帮你做codereview:使用docker安装sonarqube并扫描你的.net core元源码
  • 原文地址:https://www.cnblogs.com/dhu121/p/11755818.html
Copyright © 2011-2022 走看看