我正在处理链表,并确定使用一个全局变量作为列表中第一个"根"链接的地址会非常有益。
然后,我有其他几个函数,通过将这个"根"链接用作起始引用来利用它。
如何做到这一点?
我的尝试是(总的来说):
int rootAddress = 0;
int main(){
//EDIT float *ptr = 5; -> my mistake there is not 'float' in my code
int *ptr = 5; //but I still get these warnings
rootAddress = ptr;
return 0;
}
int laterFunction(){
// float *ptr = rootAddress;
int *ptr = rootAddress;
return 0;
}
尽管我收到了两个警告:
warning: initialization makes pointer from integer without cast
warning: assignment makes integer from pointer without cast
这样做的正确方法是什么,或者如果这种方法效率不高,通常保存这个"根"指针的最佳方法是什么?
与其使用全局变量并污染命名空间,不如考虑使用包装器结构。您将有一个用于链表的结构和另一个用于节点的结构,并且您将传递指向链表结构的指针。将按如下方式进行:
struct linkedlist {
struct node *front;
int len;
};
struct node {
int item;
struct node *next;
};
其中item
是要存储在每个节点中的项。您可以将其更改为希望或使用void指针创建通用链表的数据类型。如果您决定实现通用链表,请确保为客户端将提供的免费函数添加一个字段。
用int rootAddress = 0;
代替float *rootAddress = 0
,用rootAddress = &ptr
代替rootAddress = ptr
。您收到警告,因为您的类型不匹配。
float * rootAddress = NULL;
int main(){
float *ptr = (float *)malloc(sizeof(float));
*ptr = 5.0;
rootAddress = ptr;
return 0;
}
int laterFunction(){
float *ptr = rootAddress;
return 0;
}
只需要确保所有指针的类型相同。小心强行从一种类型转换为另一种类型。