gpt4 book ai didi

c - void 类型返回指针的函数

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:48 25 4
gpt4 key购买 nike

我是编程新手...我正在阅读的书有下面的代码...但它没有解释...我的问题是函数void(*s)() 不同于 void *s()

void show();
main()
{
void (*s)();
s=show;
(*s)();
}


void show()
{
printf("something");
}

如果我将 void(*s)() 替换为 void *s(),则会出现编译时错误,提示 error: lvalue required as left operand of赋值|在行s=show;而且如果我将 show 替换为 show() 则会发生运行时错误。谁能告诉我为什么??

最佳答案

c's operator precedence

void(*s)();

读作:定义一个变量 s,如果它被解除引用然后被调用,会产生 空值。因此 s 是指向函数的指针。

void *s();

读作:声明一个名称s,如果它被调用然后取消引用一个空值。调用运算符 () 在取消引用 * 之前被求值。因此 s 是一个函数。这一行将只声明一个没有参数的函数 s 和一个 void 指针作为返回值。它与您的第一行 void show(); 相同。只是具有不同的名称和不同的返回值。

无法分配函数

您显然知道,函数是通过附加主体 {...} 来定义的。与任何其他指针一样,函数指针也可以被赋值。这就是为什么您会收到编译器错误 lvalue required as left operand of assignment 的原因。它说:“我不允许分配到 = 的左侧”

让我们看一下代码:

s=show;

s = &show; 的简写形式 => 将函数 show 的地址赋值给指针 s。

(*s)();

解引用指针 s 然后调用它。可以缩短为 s();

另外:void(*s)(); 是一个定义,它实际上创建了一个变量,因此您可以为其赋值。void *s(); 是一个声明,它只是告诉编译器一个名为 s 的元素存在而无需创建它。由于未创建任何变量,因此您无法为其赋值。

关于c - void 类型返回指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57266382/

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