int *和Type *之间有区别吗?

时间:2010-09-22 00:55:12

标签: c pointers

我在C中实现了一个队列。我有一个类似的结构:

struct Node {
    Node* next;
    Node* previous;
    // data
}

由于nextprevious只是指针,如果我使用Node*int*会有所不同吗?例如:

struct Node {
    int* next;
    int* previous;
    // data
}

6 个答案:

答案 0 :(得分:8)

它不仅为您的代码带来了清晰度(重要的是,您的项目越大),如果您在正确的类型上进行数学计算,指针数学只能正常工作。在您的实例中,向Node *添加1将导致将sizeof(Node)添加到基指针,这几乎保证不会是== sizeof(int)。

对于你给出的例子,它可能不重要(但你需要一个演员)..但是帮自己一个忙,并养成使用正确类型的好习惯。

答案 1 :(得分:5)

使用int *不正确并导致未定义的行为。您可以使用Node *void *,但如果您使用除Node *以外的任何类型,则需要将强制转换(或隐式转换,例如通过分配)返回{{ 1}}之后你可以取消引用它。

答案 2 :(得分:4)

是的。 Node不是intNode会大于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 = ...