C语言语句分析

2019-07-20 02:41发布

typedef struct IMainTask
{
    void (*RunMainTask)(struct IMainTask* pThis, SerialPortBase* pSerialPort);
    BaseTask* pBaseTask;
} IMainTask;
IMainTask* GetMainTask(const uint8_t* msgs){...}

IMainTask* pMainTask = GetMainTask(msgs);
pMainTask->RunMainTask(pMainTask, pSerialPort);

1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
2)pMainTask->RunMainTask(pMainTask, pSerialPort); 中pMainTask可以访问RunMainTask?怎么理解 pMainTask又指回了自己IMainTask?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
edmund1234
1楼-- · 2019-07-20 05:09
本帖最后由 edmund1234 于 2019-4-9 23:30 编辑
lafayet 发表于 2019-4-9 20:47
比如    AgvState* pAgvState = pParamsFeedback->pState; 结构体AgvState没有声明对象,只是用指针指向 ...

8#,9# 都一起回吧

其实这都是我说的隐性创建对象, 例如 发送方
typedef struct {
int a;
float b;
}ABC;

ABC abc;  // 创建了ABC的对象

USART_Send((u8*)&abc, sizeof(abc));    // 在发送的时候它被转换至字节的类型

在接收方, 同样要定义同一个ABC的结构体
typedef struct {
int a;
float b;
}ABC;      // 但从来不用创建此结构体的对象

USART_Rx((u8*)RxData, sizeof(ABC));   // 接收到类型是字节的数据
ABC*  abc = (ABC*)RxData;    // 虽然你从没创建过ABC的对象, 但你现在有了ABC的对象abc了


在整个收发系统里, 是有创建对象的, 但如果说, 你只是写接收方的代码时, 你会觉得你从来没创建过对象, 但又能产生对象
这不止是在数据传送,就只在调用库函数也一样, 库函数也可以自己创建了对象, 只是给你返回此对象的指针,只是不用你创建而已




edmund1234
2楼-- · 2019-07-20 09:33
 精彩回答 2  元偷偷看……
lafayet
3楼-- · 2019-07-20 15:31
edmund1234 发表于 2019-4-9 16:41
1)pMainTask是指向IMainTask的,函数GetMainTask(msgs)返回应该是地址值,是把一个地址给了这结构体吗?
...

谢谢 1)搞明白了;2)中还有个问题如果用指针调用了函数RunMainTask(pMainTask, pSerialPort),这个函数传递的第一个参数pMainTask是指向包含这个函数上一层的结构体,这样操作是为什么呢?
lafayet
4楼-- · 2019-07-20 20:59
 精彩回答 2  元偷偷看……
edmund1234
5楼-- · 2019-07-21 00:05
 精彩回答 2  元偷偷看……
edmund1234
6楼-- · 2019-07-21 04:19
本帖最后由 edmund1234 于 2019-4-9 19:51 编辑
lafayet 发表于 2019-4-9 17:26
谢谢 1)搞明白了;2)中还有个问题如果用指针调用了函数RunMainTask(pMainTask, pSerialPort),这个函数 ...

想了一会大致明白你的意思, 这不是类, 这结构体与被它的函数指针成员, 所指着的函数没有任何从属关系, 所以没什么上一层的关系

一周热门 更多>