两个指针相关的问题

时间:2013-07-22 19:12:36

标签: c++ pointers function-pointers

我希望了解以下两段代码。我不熟练使用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);

3 个答案:

答案 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 *;该函数不带参数。