gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:37:46 25 4
gpt4 key购买 nike

我很困惑为什么在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;

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

最佳答案

用于更新内存

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

#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

减少参数传递的成本

即使您不需要这种修改行为,传递指针仍然可以节省空间,因为您不必复制整个结构,而只需复制一个指针。对于只有一个整数字段的结构来说,这并不是一个很大的区别(如果有的话),但对于具有多个字段的结构来说,这一点很重要。

对于自引用类型

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

关于c - 为什么我们对对象使用指针而不是直接使用对象值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com