我很困惑为什么在this tutorial他们使用Node *next
而不是仅仅创建像Node node
这样的结构。为什么是这样?与char *string
等其他对象相同。
我理解指针是包含地址的变量,因此它们保存的地址的值为Node
或char
,对吧?但为什么要保留他们的地址而不是直接写信给他们?
以下代码完全有效,对吧?
typedef struct {
int health;
} Boss;
Boss bigBoss;
bigBoss.health = 40;
Boss newBoss;
newBoss.health = 100;
bigBoss = newBoss;
为什么这不是传统的做事方式?指针的优点是什么?
答案 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
即使您不需要此修改行为,传递指针仍可节省空间,因为您不必复制整个结构,而只需复制指针。对于只有一个整数字段的结构,这不是一个很大的区别,如果存在差异,但对于具有多个字段的结构,这很重要。
结构的实例实际上只是由结构中声明的字段填充的内存块。记忆的斑点有多大?好吧,它需要至少足够大以容纳字段,并且可能对于内存对齐而言可能更大一些。一些数据结构保存对同一数据结构的其他实例的引用(例如,链接列表和树是最早遇到的数据结构中的一些)。链接列表节点需要多大才能保存元素和下一个节点?嗯,大小(节点)=大小(元素)+大小(节点)。这显然是行不通的。另一方面,指针是固定大小,因此我们可以具有一个节点,该节点具有一个元素,指针到另一个节点。