我正在使用C语言实现一个队列。我有一个结构体如下:
struct Node {
Node* next;
Node* previous;
// data
}
next
和previous
只是指针,那么使用Node*
还是int*
有什么区别吗?例如:
struct Node {
int* next;
int* previous;
// data
}
使用int *
是不正确的,会导致未定义的行为。您可以使用Node *
或void *
,但如果您使用除Node *
之外的任何类型,那么在您对其进行解引用之前,都需要强制转换(或隐式转换,例如通过赋值)回到Node *
。
是的,它确实有区别。 Node
不是一个 int
(Node
的大小将大于 int
),因此指向 int
或指向 Node
的指针会有所不同。
每个人都对每件事情都是正确的。
关键在于,即使您知道指针的内部表示是一个地址,无论数据类型如何,C语言并不会做出这样的假设。
包含显式类型可以让编译器更好地检查您的代码。
当然,您总是可以将指针强制转换为不同的类型,但是那么您需要在适当的上下文中使用转换后的类型。
顺便说一句,我学习的严格的C语言(早在侏罗纪时代)不允许您的第一个示例(C++和一些现代C编译器可以)。相反,您需要这样说:
struct Node {
struct Node* next;
struct Node* previous;
// data };
当你使用int *时,意味着你指向一个整数,而当你使用Node *时,意味着你指向一个节点。
区别在于指针所指空间的大小。当它是int *时,pointer++将使指针移动sizeof(int)个字节,而当它是Node *时,pointer++将使指针移动sizeof(Node)个字节。
Node * pNode;
期望可以不需要任何强制转换地编写以下表达式
(*pNode).next = ...
pNode->next = ...
struct
标签。这种隐式查找只在C++中定义,在标准C中是错误的。 - Jens Gustedt