C语言声明的各种复杂情况

你知道 下面这个东西指什么吗?

char * const *(*next)();

说起来,c语言真的太容易出现各种莫名其妙(不能明白其中的奥妙)的东西了。

看下面这个东西

上面的就应该被理解为 next是一个函数指针,它返回一个指针,它指向一个类型为char的常量指针。

有下面这些例子

  1. 高级声明
    1. 看个例子    int      *a;    它把*a声明为一个整数,由此推断出a是一个指向整数的指针。所以 int   *f,g;只有f是指针,g是整型。
    2. int   *f();   f是一个返回指向int类型指针的函数,而 int   (*f)();  第二个括号是函数操作调用符,第一对括号只起到了聚组的作用,它迫使间接访问在函数调用之前进行,使f成为了一个函数指针,它所指向的函数用于返回一个整数值。
    3. int    *(*f)();  这个就容易理解了,f是一个指向返回值是一个int类型的指针的函数的指针。
    4. int  *f[ ]; []的优先级比*的优先级要高,所以f是一个数组,然后类型是int指针。
    5. int   f()[] f是一个函数,返回值为整型数组(非法,c语言函数无法返回数组)
    6. int   f[]() f是一个函数的数组 非法(函数无法统一长度,所以不可能成为数组)
    7. int  (*f[])();  f首先是一个数组,然后f的元素是int型的指针,然后()又说明它势函数,所以f是一个函数指针的数组,返回的值是一个整数值
    8. int  *(*f[])(); f是返回int指针的函数的指针数组..(1 f是数组,f是指针数组,f是函数指针数组,f是返回值为int指针的函数指针数组

巧用typedef 

先看一个有点可怕的东西

void (*signal(int sig, void(*func)(int)))(int);

哈哈,反正我看到的时候是一脸懵逼。

signal是一个函数,返回值是一个指向返回值为void,参数为int的函数指针。

signal的第二个参数,void(*func)(int) 表示一个函数指针,返回值为void,接受一个int参数。

用typedef来简化

typedef void(*ptr_to_func) (int);
/**
*它定义ptr_to_func为一个函数指针
**/

ptr_to_func signal(int, ptr_to_func);
/**
*表示signal是一个函数,接受另外两个参数,返回一个函数指针
**/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值