C指针复杂声明

查看:104
本文介绍了C指针复杂声明的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

char (*(*x())[])();

char (*(*x[3])())[5];

请描述一下上面的两个指针的含义,如果能写两个实例的话,就更好了。

解决方案

对于这种复杂的声明格式,可以采用替换的形式来看明白。

比如char (*(*x())[])();这个, 你可以找个 a代替括号里面的,然后逐步代替。

char (*(*x())[])();
// 用a 代替 (*x())[]
char (*a)();
// 上面的a的意思就是一个函数指针,空参,返回char
// 再看(*x())[],用b代替 *x()
(b)[];
// b是一个数组,而且数组每一项是一个指针a
*x();
// x是一个空参函数,返回类型是一个b的指针

所以上面的x是一个函数,参数为空,返回值是一个数组的指针,数组的每一项是一个指针,指向的是一个函数指针,这个函数的形式是空参返回char。

所以使用的方式就是

char f1(){return 1;};
char f2(){return 2;};

char (*(*x())[2])(){
    typedef char A();
    
    A* f = f1;
    
    typedef A* B[];
    
    B arr = {f,f};
    
    typedef B* F();
    
    return &arr;    
};

同样的道理
char (*(*x[3])())[5];这个表达式的使用方式就是

typedef char A[5];

A* b(){
    static A a = {1,2,3,4,5};
    return &a;
}

typedef A* B();

char (*(*x[3])())[5] = {&b,&b,&b};

也就是说x 是个有3个值的数组,每个数组的类型是一个函数指针,这个函数(b)是空参,返回的是一个指针,指向一个含有5个char的数组。

这篇关于C指针复杂声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆