理解奇怪的返回语法:return(* scriptFunction [x])(arguments);

时间:2015-11-06 01:47:31

标签: c

我知道这个标题是可怕的,为此我很抱歉;老实说,我不知道怎么问我的问题,因为我对此事没有很好的教育。下面是我的问题所关注的一小部分代码,因为我不知道发生了什么,或者它是否有效!虽然,我怀疑它是有效的。

return(*scriptFunction[x])(arguments);

根据我的理解,你只能在C中返回1个值(你可以有多个return语句,但这是不同的,不在主题上)。上述陈述实际上是做什么的?

3 个答案:

答案 0 :(得分:7)

代码:

return(*scriptFunction[x])(arguments);

实际上 只返回一个值。

变量scriptFunction将是一个函数指针数组(1)。您查找该数组的元素编号x,并调用该函数,并传递参数arguments。然后来自 函数的返回值就是您返回给调用者的内容。

除了函数指针方面,它与return sqrt(42)没有区别。

举例来说,以下程序演示了如何做到这一点:

#include <stdio.h>

// Two simple functions which add a fixed value.

int fnPlus3 (int n) { return n + 3; }
int fnPlus7 (int n) { return n + 7; }

// An array holding those two functions.

int (*scriptFunction[])(int) = { fnPlus3, fnPlus7 };

int main (void) {
    // Call first function in array.

    int x = 0;
    printf ("%d\n", (*scriptFunction[x])(100));

    // Then call second one.

    x = 1;
    printf ("%d\n", (*scriptFunction[x])(100));

    return 0;
}

虽然打印函数的返回值而不是再次返回它,但它仍然使用相同的表达式,你可以看到它调用基于它的不同函数价值x

103
107

(1)或某种形式的等价物,例如指向函数指针数组的指针,或指向单个函数指针的指针(假设x始终设置为零在后一种情况下)。

答案 1 :(得分:2)

据推测,scriptFunction是指向函数的指针数组。 *scriptfunction[x]是指向函数的解引用指针(x - 第一个)。最后,*scriptfunction[x](arguments)表示应用于arguments的函数的调用,因此该函数的结果是最终返回的内容。

旁注:*并非真的有必要。指向函数的指针不需要取消引用来调用函数,即你可以使用

return scriptFunction[x](arguments);

代替。

答案 2 :(得分:0)

从它的外观来看,似乎行return (*scriptFunction[x])(arguments); scriptFunction是一个函数指针数组,这只是在变量x索引的位置调用函数并发送{ {1}}变量内容作为输入。

此调用函数的返回值是最终返回的值。

这个工作示例应该很有用:

arguments

输出如下:

#include <iostream>
using namespace std;

void func_a(int i)
{
        cout << "func_a: " << i << endl;
}

void func_b(int i)
{
        cout << "func_b: " << i << endl;
}

int main()
{
        void (*funcs[])(int) = { func_a, func_b };

        for(int i = 0; i < 2; ++i)
                (*funcs[i])(i+1);

        return 0;
}

此外,为了将来参考,您应该咨询:How to ask good questions?