c函数指针返回值

时间:2015-09-12 15:24:59

标签: c pointers

当我尝试这个时,我正在享受一些乐趣:

#include <stdio.h>
#include <string.h>

typedef void (*Function)(char *);

void helloWorld(char *);
void execute(Function, char *);

Function func;

int main(void){
    char *message = "StackOverflow";
    execute(helloWorld, message);

    printf("%s", message);
    return 0;
}

void helloWorld(char *message){
    printf("HelloWorld, %s.\n", message);
    message = "DONE";
    printf("[%s]\n", message);
}

void execute(Function function, char * msg){
    func = function;
    func(msg);
}

显然我无法使用指针 - 我用作参数 - 作为指针函数的返回值。

嗯,有人可以解释这种行为吗?如何获得void函数的返回值?

2 个答案:

答案 0 :(得分:1)

所以我在写这个问题时找到了解决方案。

显然,char指针实际上并不是指针。当我意识到这一点时,它尝试使用指向指针(**)而不是它起作用。

#include <stdio.h>
#include <string.h>

typedef void (*Function)(char **);

void helloWorld(char **);
void execute(Function, char **);

Function func;

int main(void){
    char *message = "StackOverflow";
    execute(helloWorld, &message);

    printf("%s\n", message);

    return 0;
}

void helloWorld(char **message){
    printf("HelloWorld, %s.\n", *message);
    *message = "DONE";
    printf("[%s]\n", *message);
}

void execute(Function function, char ** msg){
    func = function;
    func(msg);
}

答案 1 :(得分:0)

在原始代码中:

void helloWorld(char *message){
    printf("HelloWorld, %s.\n", message);
    message = "DONE";
    printf("[%s]\n", message);
}

message = "DONE";将更改名为message本地(或“自动”)变量,因为对于所有意图和目的,函数参数都是C中的局部变量

因此,来自message的{​​{1}}局部变量的值不会改变,因为它们是两个不同的变量。

现在,在第二个示例中,您将指针传递给指针:

main

因此,您的void helloWorld(char **message){ printf("HelloWorld, %s.\n", *message); *message = "DONE"; printf("[%s]\n", *message); } 现在正在更改*message = "DONE";(参数)所指向的内容,并指向message中的message,因此它正在发生变化{来自main()的{​​1}}。来自message的{​​{1}}本身不会更改。

当然,w.r.t其他指针的字符指针并没有什么特别之处,它们和其他指针一样多。唯一特殊的事情是将字符串文字视为字符指针,但这并不重要。