gpt4 book ai didi

c - 解码C中的函数指针

转载 作者:行者123 更新时间:2023-12-03 07:07:40 26 4
gpt4 key购买 nike

是否可以在 C 中存储函数指针内容。我知道您可以将各种指针存储在变量中。但是,如果我可以“解开”整数指针(指向整数)或字符串指针(指向无符号字符),我是否能够解码函数指针.

更清楚地说,我的意思是将机器代码指令存储在变量中。

最佳答案

您忽略了一个重要事实:函数不是 C 中的(一流)对象。

C 中有两种基本类型的指针:数据指针和函数指针。两者都可以使用 * 取消引用。

相似之处到此结束。数据对象有一个存储值,因此取消引用数据指针可以访问该值:

int a = 5;
int *b = &a;
int c = *b; // 5

函数就是这个,一个函数。您可以调用一个函数,因此您可以调用取消引用函数指针的结果。它没有存储值:

int x(void) { return 1; }
int (*y)(void) = &x; // valid also without the address-of operator

// ...
int main(void)
{
int a = (*y)(); // valid also without explicit dereference like int a = y();
}

为了便于处理,C 允许在将函数分配给函数指针时省略 & 运算符,并在通过函数指针调用函数时省略显式取消引用。

简而言之:使用指针不会改变数据对象函数的语义。

<小时/>

另请注意,在这种情况下,函数和数据指针不兼容。您不能将函数指针分配给void *。甚至可能有一个平台,其中函数指针的大小与数据指针的大小不同。

<小时/>

实际上,在函数指针与数据指针具有相同格式的平台上,您可以“说服”编译器访问位于的实际二进制代码通过将指针转换为 const char * 来实现。但请注意,这是未定义的行为。

关于c - 解码C中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com