C 这个指针实际指向哪里?
我正在尝试使用LearnCodeheHardway c书学习c。在ex19中,我有以下代码:C 这个指针实际指向哪里?,c,pointers,C,Pointers,我正在尝试使用LearnCodeheHardway c书学习c。在ex19中,我有以下代码: int Monster_init(void *self) { Monster *monster = self; monster->hit_points = 10; return 1; } int Monster_attack(void *self, int damage) { Monster *monster = self; printf("You attack %s!\n
int Monster_init(void *self)
{
Monster *monster = self;
monster->hit_points = 10;
return 1;
}
int Monster_attack(void *self, int damage)
{
Monster *monster = self;
printf("You attack %s!\n", monster->proto.description);
monster->hit_points -= damage;
if(monster->hit_points > 0) {
printf("It is still alive.\n");
return 0;
} else {
printf("It is dead.\n");
return 1;
}
}
Object MonsterProto = {
.init = Monster_init,
.attack = Monster_attack
};
这是对象结构:
typedef struct {
char *description;
int (*init)(void *self);
void (*describe)(void *self);
void (*destroy)(void *self);
void *(*move)(void *self, Direction direction);
int (*attack)(void *self, int damage);
} Object;
struct Monster {
Object proto;
int hit_points;
};
这就是怪物的结构:
typedef struct {
char *description;
int (*init)(void *self);
void (*describe)(void *self);
void (*destroy)(void *self);
void *(*move)(void *self, Direction direction);
int (*attack)(void *self, int damage);
} Object;
struct Monster {
Object proto;
int hit_points;
};
我很难将脑袋集中在Monster\u init
和Monster\u attack
函数上。我定义了一个对象类型的MonsterProto
变量,其中.init
被设置为Monster\u init
函数,而.attack
被设置为Monster\u attack
函数
我想我理解了void
的概念,即声明一个具有副作用但不需要返回某些内容的函数。我不明白的是void*self指针到底指向什么,为什么它允许我调用一个没有参数的函数?自我指针的用途是什么
我不想在这里包含太多的代码,但是如果这还不足以回答这个问题,那么您可以找到所有的代码
我欣赏任何指向正确方向的指示;nu pun意图:)此代码似乎有效地实现了一种面向对象的方法
self
是传递给这些函数的struct Monster
的地址。这些函数中的每一个都在一个单独的对象上运行,传递指向该对象的指针就是它们如何知道要处理哪个对象
这:
不是“调用没有参数的函数”-结构的
init
成员是指向返回int
并接受单个void*
参数的函数的指针,该行将Monster_init()
的地址分配给它。这样,如果您有一个指向对象的指针,那么可以调用intn=myobject->proto.init(&myobject)代码>或类似代码,但不知道调用了哪个实际函数。对于不同的对象,您可能使用同一行代码调用不同的函数 self
是传递给这些函数的struct Monster
的地址。这些函数中的每一个都在一个单独的对象上运行,传递指向该对象的指针就是它们如何知道要处理哪个对象。不知道你从哪里得到“调用一个没有参数的函数”。@PaulGriffiths我想我理解你的意思。我对对象结构内部的init指针函数感到困惑。但是我现在意识到,.init=Monster\u init
实际上并不是在调用一个没有参数的函数,而是说我们有一个指针,它应该指向那个特定的函数。因此,正如您所说,self成为结构怪物的地址。谢谢如果你想将此作为回复,我将接受答案。好的,我知道你要去哪里。是的,关于.init
是函数指针的说法是正确的。