当我尝试这个时,我正在享受一些乐趣:
#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函数的返回值?
答案 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其他指针的字符指针并没有什么特别之处,它们和其他指针一样多。唯一特殊的事情是将字符串文字视为字符指针,但这并不重要。