Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这个指针实际指向哪里?_C_Pointers - Fatal编程技术网

C 这个指针实际指向哪里?

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

我正在尝试使用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", 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
是函数指针的说法是正确的。