指向函数指针的指针 - 表达式必须是可修改的左值

Posted

技术标签:

【中文标题】指向函数指针的指针 - 表达式必须是可修改的左值【英文标题】:pointer to function pointer - expression must be a modifiable lvalue 【发布时间】:2015-12-02 13:48:14 【问题描述】:

我想在函数Check_Commands中获取需要的函数的地址,放到指针fptr中,然后调用它。但是,在尝试编译此代码时,我收到以下消息:

“错误[Pe137]:表达式必须是可修改的左值”

我错过了什么吗?

void main(void)

   ...

   void(*fptr)(CmdDataType);

   Check_Commands(&fptr);

   (*fptr)(&CmdData);



void Check_Commands(void (**ptrfuncptr)(CmdDataType))

   ...

   **ptrfuncptr=&DispFirmware;

   ...



void DispFirmware(CmdDataType *CmdData_ptr)

   ...

【问题讨论】:

错误出现在哪一行? 【参考方案1】:

这个:

**ptrfuncptr=&DispFirmware;

应该是

*ptrfuncptr = DispFirmware;

此外,调用时不需要取消引用函数指针,函数的名称可以被认为是指向它的指针,因此普通调用就像通过指针一样工作。

【讨论】:

【参考方案2】:

您的代码存在一些问题。这是固定版本:

void main(void)

   CmdDataType CmdData;

   void (*fptr)(CmdDataType *);

   Check_Commands(&fptr);

   (*fptr)(&CmdData);



void Check_Commands(void (**ptrfuncptr)(CmdDataType *))


   *ptrfuncptr=&DispFirmware;




void DispFirmware(CmdDataType *CmdData_ptr)  

fptr 是一个指向以CmdDataType 指针作为参数的函数的指针,因此需要对其进行修复。

并且在函数Check_Commands中,函数指针只需要解引用一次。

【讨论】:

以上是关于指向函数指针的指针 - 表达式必须是可修改的左值的主要内容,如果未能解决你的问题,请参考以下文章

表达式必须是结构指针上的可修改左值

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

表达式必须是可修改的左值(字符数组)

错误:表达式必须是可修改的左值

C++ 表达式必须是可修改的左值