为什么我们直接使用指针而不是对象值?

时间:2014-02-27 19:06:31

标签: c pointers struct

我很困惑为什么在this tutorial他们使用Node *next而不是仅仅创建像Node node这样的结构。为什么是这样?与char *string等其他对象相同。

我理解指针是包含地址的变量,因此它们保存的地址的值为Nodechar,对吧?但为什么要保留他们的地址而不是直接写信给他们?

以下代码完全有效,对吧?

typedef struct {
    int health;
} Boss;

Boss bigBoss;
bigBoss.health = 40;

Boss newBoss;
newBoss.health = 100;

bigBoss = newBoss;

为什么这不是传统的做事方式?指针的优点是什么?

1 个答案:

答案 0 :(得分:1)

用于更新内存

您的作业从结构中复制内容,但仍有两种不同的结构:

#include<stdio.h>

typedef struct {
    int health;
} Boss;

int main() { 

  Boss bigBoss;
  bigBoss.health = 40;

  Boss newBoss;
  newBoss.health = 100;

  bigBoss = newBoss;

  bigBoss.health = 1;
  newBoss.health = 2;
  printf("%d %d\n", bigBoss.health, newBoss.health);

}
1 2

复制行为与将结构直接传递给函数时的行为相同。如果您将Boss传递给函数并尝试修改它,您将修改该函数的本地副本,而不是原始Boss。如果您将指针传递给Boss,则可以修改原始Boss的内容。例如:

#include<stdio.h>

typedef struct {
    int health;
} Boss;

void fail_attack( Boss boss ) {
  boss.health -= 10;
}

void succeed_attack( Boss *boss ) {
  boss->health -= 10;
}

int main() { 
  Boss bigBoss;
  bigBoss.health = 40;

  fail_attack( bigBoss );
  printf( "after fail_attack, health: %d\n", bigBoss.health );

  succeed_attack( &bigBoss );
  printf( "after succeed_attack, after succeed_attack, health: %d\n", bigBoss.health );

}
after fail_attack, health: 40
after succeed_attack, health: 30

降低参数传递的成本

即使您不需要此修改行为,传递指针仍可节省空间,因为您不必复制整个结构,而只需复制指针。对于只有一个整数字段的结构,这不是一个很大的区别,如果存在差异,但对于具有多个字段的结构,这很重要。

对于自引用类型

结构的实例实际上只是由结构中声明的字段填充的内存块。记忆的斑点有多大?好吧,它需要至少足够大以容纳字段,并且可能对于内存对齐而言可能更大一些。一些数据结构保存对同一数据结构的其他实例的引用(例如,链接列表和树是最早遇到的数据结构中的一些)。链接列表节点需要多大才能保存元素和下一个节点?嗯,大小(节点)=大小(元素)+大小(节点)。这显然是行不通的。另一方面,指针是固定大小,因此我们可以具有一个节点,该节点具有一个元素,指针到另一个节点。