【大牛】大牛给指针,极难

有人做过ios程序吗?
【问题】 2015/7/3 14:29:49
typedef struct T{ union { struct T* (*v)(const *[]); const * const r; };}const*(*(*(*(*v)[1])[1])(struct { const c;}*(*)(struct T *[])))(const[]);
int main()
{ return 0; }
【唠叨】小六子 2015/7/3 15:55:57
这个代码应该不全吧
或者说是不对的
【吐槽】【大牛】2015/7/3 20:33:56
?哪里不对了?

【吐槽】【大牛】2015/7/3 20:35:21
就是把一个指向一个元素数组指针的类型定义成v而已……
【唠叨】小六子2015/7/3 20:37:00
还是没看懂
【唠叨】小六子 2015/7/3 20:39:37
为什么学了这么久的c,也看书了,这点破指针还是玩不转。。。    
【吐槽】【大牛】2015/7/3 20:40:35
……这个技能很简单的啊,多练就好

【吐槽】【大牛】 2015/7/3 20:40:58
是啊
【唠叨】小六子 2015/7/3 20:41:11
主要平时看都看不懂,怎么写呀
他这段代码就看不懂

【吐槽】【大牛】 2015/7/3 20:41:41
这代码写的很复杂,我在朋友家,回去了教你们怎么看以及怎么整理成人看的懂的格式
【唠叨】小六子 2015/7/3 20:41:54
哦哦

【吐槽】【大牛】2015/7/4 1:45:54
typedef struct T{ union { struct T* (*v)(const *[]);
const * const r; };}const*(*(*(*(*v)[1])[1])(struct
{ const c;}*(*)(struct T *[])))(const[]);

// 太复杂了,怎么办?首先,我们找到第一个词,是struct,回忆struct的语
// 法:struct name { ... },先把这个定义出来:
typedef struct T {
    union {
        struct T* (*v)(const *[]);
        const * const r;
    };
} Type1;

// 换进去:
typedef Type1 const*(*(*(*(*v)[1])[1])(struct
{ const c;}*(*)(struct T *[])))(const[]);

//然后,下一个括号是(),我们把括号里面的忽略掉,看看外面是啥?
typedef Type1 const*(...)(const[]);

// 是个函数嘛,定义一下:
typedef Type1 const* Type2(const[]);

// 换进去:
typedef Type2* (*(*(*v)[1])[1])(struct { const c;}*(*)(struct T *[]));

// 同样的办法:
typedef Type2* (Type3)(struct { const c;}*(*)(struct T *[]));
typedef Type3* (*(*v)[1])[1];

typedef Type3* Type4[1];
typedef Type4* ((*v)[1]);

typedef Type4* Type5[1];
typedef Type5* v;

// 整理一下,使用同样的方法,把任何复杂的部分提出来:
typedef struct T* Type1_Func(const *[]);
typedef struct T {
    union {
        Type1_Func* v;
        const * const r;
    };
} Type1;
typedef Type1 const* Type2(const[]);
typedef struct { const c; } Type3_Arg_Ret;
typedef struct T *Type3_Arg_Arg;
typedef Type3_Arg_Ret* Type3_Arg(Type3_Arg_Arg*);
typedef Type2* (Type3)(Type3_Arg*);
typedef Type3* Type4[1];
typedef Type4* Type5[1];
typedef Type5* v;

然后从上往下看:
1. v是一个类型(typedef)
2. 这个类型是一个指针,指向另外一个类型Type5
3. Type5是一个数组,只有一个元素,类型是指向Type4的指针。
4. Type4是一个数组,只有一个元素,类型是指向Type3的指针。
5. Type3是一个函数,这个函数返回指向Type2的指针
    - 它的参数是一个指向Type3_Arg类型的指针。
6. Type3_Arg是一个函数
    - 这个函数返回指向Type3_Arg_Ret的指针
    - 接受一个指向Type3_Arg_Arg的类型的指针。
7. Type3_Arg_Ret是一个结构体
    - 结构体里只有一个不能改变的int成员c(没有写类型的默认是int)。
8. Type3_Arg_Arg是一个指针
    - 指向结构体T(结构体T到底是什么我们还不知道,所以叫不完整类型)。
9. Type2是一个函数
    - 这个函数返回指向不能改变的Type1类型的指针
    - 接受一个不能改变的int类型的指针(指向数组,但是不强制)作为参数。
10. Type1类型是一个结构体
    - 这个结构体又叫struct T(现在struct T不是不完整类型了哦!)
    - struct T结构体只有一个匿名联合作为成员(这是不符合标准的!但是很多编译期都支持)
        - 这个匿名联合有两个成员
            - 它可以是指向Type1_Func的指针类型的v
                - Type1_Func类型是一个函数
                    - 它返回指向结构体T的指针
                    - 接受一个指向数组(不强制)的指针作为参数
                        - 这个数组的每个元素是一个指向不能改变的int类型的变量的指针。
            - 也可以是不能改变的,指向不能改变的int类型的指针r

int main()
{ return 0; }

【吐槽】【大牛】 2015/7/4 1:49:24
1. 是从下往上看
2. 这个明显不是实际例子,就是生造出来体现C的声明的复杂性的
3. 但是,这也体现了C的声明的优越性:一个很短的式子可以表达很丰富的概念
4. 然而,将这些概念用有意义的方式去分离开,才是合理的做法
5. 最后要指出的是,这是一个不符合标准的C89的声明,具体体现在:
5.1 省略int的用法在C99被废除了
5.2 任何一个C语言标准都不允许匿名联合的出现,这是一个编译器扩展,虽然VC和gcc都支持这个扩展。
我说完了
【唠叨】小六子 2015/7/4 7:14:38
哦,昨天有点累,等着等着然后就睡了

时间: 2024-09-30 07:21:13

【大牛】大牛给指针,极难的相关文章

【C++基础】指针好难啊,一点点啃——基本概念

指针保存的是另一个对象的地址(概念真的很重要!!) int a=1; int *ptr = &a;//*定义一个指向int类型的指针ptr, &a取变量a的地址 一.指针的初始化 几个概念,迷途指针==野指针==悬浮(dangling)指针==失控指针 当对一个指针delete后,会释放原来的内存,但指针变量名依然存在,值却没有设置为NULL或0,这就相当于声明一个指针时没有初始化, 当再次使用该指针时,则会出现严重错误(崩溃是肯定的,本人还没体会到多严重),以上是我的理解 原则:不能使用

指针重难、易错点

(一)函数指针 在前边的blog中,已经整理归纳了数组和初级指针,接下来,我来继续整理高级指针和如何正确使用指针. 我们说过,指针数组是一个数组,每个元素是指针:数组指针是个指针,指向的是数组.所以: 函数指针就是指向函数的指针.我们先看以下代码: <pre name="code" class="cpp">void fun() { } int main() { printf("%p",fun); printf("%p&quo

技术人的小目标:10000小时理论落地,你就是大牛

技术人的小目标 首富王健林在采访时不经意的一句话“先定一个能达到的小目标,比方说我先挣它一个亿”瞬间刷爆了朋友圈,朋友们都在充分发挥调侃和自黑的潜力,各种段子都在说自己要先定一个能达到的小目标,比如说我先挣10 billion的津巴布韦元 :) 抛开首富的小目标对于我们普通老百姓来说过于宏大这点外,其实这句话也是挺有道理的,简单来说就是要循序渐进,不要期望一口吃成一个大胖子.这个道理其实平时大家也都懂,但在这个浮躁的社会,要真正理解并采取行动,并不那么简单,比如说“技术人员如何成为大牛”这个话题

【转】11位机器学习大牛最爱算法全解

转自:http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2651987052&idx=3&sn=b6e756afd2186700d01e2dc705d37294&chksm=f121689dc656e18bef9dbd549830d5f652568f00248d9fad6628039e9d7a6030de4f2284373c&scene=25#wechat_redirect 1.Yann LeCun,Faceb

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

黑马程序员---ios开发之,property指针在ios5中的一些说明

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序

(转载)你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针 3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的

@properties指针说明

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的数据之外,在程序设计当中,我们还有另外一种数据经常需要处理,那