我可以改变指针的功能吗?

Mac*_*eus 2 c pointers function

在脚本语言中,例如Perl和Python,我可以在运行时更改函数.我可以通过将指针更改为函数来在C中执行某些操作吗?

就像是:

void fun1() {
    printf("fun1\n");
}

void fun2() {
    printf("fun2\n");
}

int main() {
    fun1 = &fun2;
    fun1(); // print "fun2"
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Vis*_*esn 6

是; 你可以,这是一个简单的程序,可以帮助你理解这一点

 #include <stdio.h>
 void fun1() {
    printf("fun1\n");
 }

 void fun2() {
    printf("fun2\n");
 }

 int main() {
       void (*fun)() = &fun1;
       fun(); // print "fun1"
       fun = &fun2;
       fun(); // print "fun2"
       return 0; 
 }
Run Code Online (Sandbox Code Playgroud)

产量

? ./a.exe
fun1
fun2
Run Code Online (Sandbox Code Playgroud)

  • 不需要`&`. (5认同)

Wer*_*nze 6

你不能改变fun1,但你可以声明一个函数指针(不是函数,只是指向函数的指针).

void (*fun)();
fun = fun1;
fun(); /* calls fun1 */
fun = fun2;
fun(); /* calls fun2 */
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到没有必要明确地获取fun1/fun2的地址,您可以省略运算符'&'的地址.

  • 不需要`&`. (3认同)

Per*_*xty 6

,你不能这样做.

您可以将fun1视为该函数的固定入口点的占位符.

您正在寻找的语义是从fun1=&fun2;每个调用点到被调用的fun1原因fun2.

fun1是一个值而不是一个变量.在语句中以相同的方式int x=1; x是变量并且1是值.

你的代码没有比思考1=2;编译更有意义,从那时起x=x+1;将导致x增加2.

仅仅因为fun1是标识符并不意味着它是一个变量,更不用说可分配了.