7

嗨,我在“测试你的 C++ 技能”中遇到了这个问题。

请让我知道一个例子是什么意思?

已编辑部分:抱歉多余的括号,已编辑和删除。

char (*(*a[4])())[5]
4

4 回答 4

25

遵循螺旋规则(由 chris 链接),并从标识符开始:

a

...是...

a[4]

...一组 4 个...

*a[4]

...指向...的指针

(*a[4])()

...一个不带参数的函数...

*(*a[4])()

...返回指向...的指针

(*(*a[4])())[5]

...五个数组...

char (*(*a[4])())[5]

...字符。

旁注:去给提出这个问题的架构师一个好的修饰,然后找到编写这个代码但没有注释解释它的程序员,给一个好的修饰。如果这是作为家庭作业给你的,请告诉你的老师,他应该指导你如何使用 cdecl,或者如何以一种看起来不像疯子潦草的方式设计代码,而不是浪费你的时间有了这个。

于 2012-06-24T07:31:15.543 回答
16

我通过删除我认为是多余的右括号并将结果粘贴到cdecl中作弊。

declare a as array 4 of pointer to function returning pointer to array 5 of char

于 2012-06-24T07:15:28.790 回答
13

还有一个例子……除了一个例子之外永远不要做什么。

#include <iostream>

typedef char stuff[5];
stuff stuffarray[4] = { "This", "Is", "Bad", "Code" };

stuff* funcThis()   { return &(stuffarray[0]); }
stuff* funcIs()     { return &(stuffarray[1]); }
stuff* funcBad()    { return &(stuffarray[2]); }
stuff* funcCode()   { return &(stuffarray[3]); }

int main()
{
    char (*(*a[4])())[5] = { funcThis, funcIs, funcBad, funcCode };
    for(int i = 0; i < 4; ++i)
    {
        std::cout << *a[i]() << std::endl;
    }
    return 0;
}
于 2012-06-24T08:39:05.950 回答
8

这是一个例子......

#include <stdio.h>

char a[5] = "abcd"; 
char b[5] = "bcde"; 
char c[5] = "cdef"; 
char d[5] = "defg"; 

char (*f1())[5] { return &a; }
char (*f2())[5] { return &b; }
char (*f3())[5] { return &c; }
char (*f4())[5] { return &d; }

int main()
{
        char (*(*a[4])())[5] = { &f1, &f2, &f3, &f4 };
        for (int i = 0; i < 4; i++)
                printf("%s\n", *a[i]());
        return 0;
}
于 2012-06-24T08:23:02.293 回答