我希望了解以下两段代码。我不熟练使用C ++和指针,并且可以使用它们的操作对我来说仍然有点不清楚。
我无法理解这个功能实际上做了什么。它需要一个unsigned char指针并返回一个。但是我目前看到它的方式,它只返回指向与原始位置相同的指针。我可能很好错了。
unsigned char* MemoryPool::GetNext(unsigned char* pBlock)
{
unsigned char** ppChunkHeader = (unsigned char**)pBlock;
return ppChunkHeader[0];
}
编辑:我尝试提高格式质量并澄清问题。感谢您提供的有用的评论和答案。
我知道这是一个typedef 别名(这是一个正确的术语吗?)一个函数指针,类型名称为ActorComponent。但是函数指针的函数类型返回什么?如果函数指针语法是:
void (*foo)(int);
那么在下面的代码行中括号前面的星号是什么意思?
typedef ActorComponent *(*ActorComponentCreator)(void);
答案 0 :(得分:2)
在我看来,第一个并没有做太多。它将传入的指针强制转换为unsigned char,作为指向char的指针(一个危险的旧c样式转换)。然后它使用一个事实,即数组解引用就像一个指针解除引用,将原始指针返回给unsigned char。
typedef ActorComponent *(*ActorComponentCreator)(void);
创建一个函数指针。在这种情况下,ActorComponentCreator是一个引用指向函数的指针的名称,该函数获取void并返回指向ActorComponent的指针。
答案 1 :(得分:2)
如果我们看一下:
typedef ActorComponent *(*ActorComponentCreator)(void);
并稍微改变一下:
typedef ActorComponent* (*ActorComponentCreator)(void);
它更加清晰,它是一个函数指针,指向一个返回指向ActorComponent
的函数的函数。
与:比较:
typedef int* (*FuncReturningInt)(void);
答案 2 :(得分:1)
第一个代码被赋予unsigned char *
(大致就像是void *
;代码很旧,或基于非常旧的软件),将其转换为指向指针的指针到unsigned char
,然后返回第0 unsigned char *
。因此,它将传递的位置视为unsigned char *
值数组的开头,并返回该数组中的第0个项。在C ++中,这不是很好的代码;它会更像C代码。
第二个代码声明了一个指向名为ActorComponentCreator
的函数类型的指针。该函数返回ActorComponent *
;该函数不带参数。