我在C中实现了一个队列。我有一个类似的结构:
struct Node {
Node* next;
Node* previous;
// data
}
由于next
和previous
只是指针,如果我使用Node*
或int*
会有所不同吗?例如:
struct Node {
int* next;
int* previous;
// data
}
答案 0 :(得分:8)
它不仅为您的代码带来了清晰度(重要的是,您的项目越大),如果您在正确的类型上进行数学计算,指针数学只能正常工作。在您的实例中,向Node *添加1将导致将sizeof(Node)添加到基指针,这几乎保证不会是== sizeof(int)。
对于你给出的例子,它可能不重要(但你需要一个演员)..但是帮自己一个忙,并养成使用正确类型的好习惯。
答案 1 :(得分:5)
使用int *
不正确并导致未定义的行为。您可以使用Node *
或void *
,但如果您使用除Node *
以外的任何类型,则需要将强制转换(或隐式转换,例如通过分配)返回{{ 1}}之后你可以取消引用它。
答案 2 :(得分:4)
是的。 Node
不是int
(Node
会大于int
),因此指向int
的指针或指向Node
的指针差异。
答案 3 :(得分:2)
每个人都对一切都是正确的。
关键是,即使您可能知道指针的内部表示是一个地址,无论数据类型如何,C都不会做出这样的假设。
包含显式类型允许编译器更好地检查代码。
当然,您始终可以将指针强制转换为其他类型,但是您需要在适当的上下文中使用casted-type。
顺便说一下,我学到的严格的C(回到侏罗纪时代)不会允许你的第一个例子(C ++会这样做,现在做一些现代的C编译器)。相反,你不得不说
struct Node {
struct Node* next;
struct Node* previous;
// data };
答案 4 :(得分:0)
使用int *时,表示您指向一个整数,当您使用Node *时,表示您指向一个节点。
区别在于指针指向的空间大小。当它的int *,指针++将通过sizeof(int)移动指针,当它的Node *,指针++将指针移动sizeof(Node)。
答案 5 :(得分:0)
如果有
Node * pNode;
期望能够在没有任何演员
的情况下编写如下的表达式(*pNode).next = ...
pNode->next = ...