int* 和 Type* 有什么区别?

3

我正在使用C语言实现一个队列。我有一个结构体如下:

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

nextprevious只是指针,那么使用Node*还是int*有什么区别吗?例如:

struct Node {
    int* next;
    int* previous;
    // data
}
6个回答

8
不仅能为您的代码提供清晰度(这很重要,项目越大),而且只有在对正确类型进行计算时指针数学才能正常工作。在您的情况下,将1添加到Node*将导致将sizeof(Node)添加到基指针,这几乎肯定不等于sizeof(int)。
对于您给出的示例,可能并不重要(但您需要进行转换)......但是请自己做个好习惯,现在就使用正确的类型。

5

使用int *是不正确的,会导致未定义的行为。您可以使用Node *void *,但如果您使用除Node *之外的任何类型,那么在您对其进行解引用之前,都需要强制转换(或隐式转换,例如通过赋值)回到Node *


4

是的,它确实有区别。 Node 不是一个 intNode 的大小将大于 int),因此指向 int 或指向 Node 的指针会有所不同。


2

每个人都对每件事情都是正确的。

关键在于,即使您知道指针的内部表示是一个地址,无论数据类型如何,C语言并不会做出这样的假设。

包含显式类型可以让编译器更好地检查您的代码。

当然,您总是可以将指针强制转换为不同的类型,但是那么您需要在适当的上下文中使用转换后的类型。

顺便说一句,我学习的严格的C语言(早在侏罗纪时代)不允许您的第一个示例(C++和一些现代C编译器可以)。相反,您需要这样说:

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

1
一点也不奇怪,这是标准的C语言。 - R.. GitHub STOP HELPING ICE
很有趣的是想知道哪些C编译器允许这种奇怪的方式来引用一个没有前缀“struct”的struct标签。这种隐式查找只在C++中定义,在标准C中是错误的。 - Jens Gustedt

0

当你使用int *时,意味着你指向一个整数,而当你使用Node *时,意味着你指向一个节点。

区别在于指针所指空间的大小。当它是int *时,pointer++将使指针移动sizeof(int)个字节,而当它是Node *时,pointer++将使指针移动sizeof(Node)个字节。


0
如果有的话
Node * pNode;

期望可以不需要任何强制转换地编写以下表达式

(*pNode).next = ...
pNode->next = ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接