【发布时间】:2009-04-02 17:14:22
【问题描述】:
我有一本这样的字典:
typedef struct dictNode {
int key;
char *value;
struct dictNode *next;
} Dict;
还有一个 get() 函数,如下所示:
char *get(const Dict *dict, int key) {
if(!dict) return NULL;
Dict *currPtr = dict;
while(currPtr) {
if(currPtr->key == key) {
return currPtr->value;
}
currPtr = currPtr->next;
}
}
编译此代码会产生以下错误:
dict.c:85: 警告:初始化会丢弃指针目标类型的限定符
此警告指的是以下行:
Dict *currPtr = dict;
如果我在该行之前添加一个“const”,如下所示:
const Dict *currPtr = dict;
警告消失...
1) 我不明白的第一件事是:我在 get() 的 dict 参数 中添加了“const”,所以如果我尝试更改 dict 指向的地址,编译器会警告我,否则我将无法访问主程序中的字典,因为我也丢失了我指向的地址。现在,我正在创建一个新指针 currPtr,它指向与 dict 相同的位置。这样,我改用这个指针来遍历字典并保持 dict 指针不变。为什么我还需要为 currPtr 设置 const?
2) 我不明白的第二件事是:currPtr = currPtr->next; 行正在改变 currPtr 指针,那么,如果我将 const 添加到 currPtr,为什么编译不会警告我?
然后我有一个 del() 函数,如下所示:
Dict *del(const Dict *dict, int key) {
if(!dict) return NULL;
Dict *currPtr = dict;
Dict *prevPtr = dict;
while(currPtr) {
if(currPtr->key == key) {
prevPtr->next = currPtr->next;
free(currPtr);
}
prevPtr = currPtr;
currPtr = currPtr->next;
}
return dict;
}
请注意,我知道此删除功能代码不完整,例如,如果我想删除第一个元素,它就无法正常工作。没关系,我晚点说完,证明我的问题就够了……
3) 所以,在 get() 函数中,我需要将 const 添加到 currPtr 但在这个 del() 函数,我不需要将 const 添加到 currPtr 或 prevPtr 吗?在这两个函数中,我都在更改 currPtr 指针,在 del() 函数的情况下,我也在更改 prevPtr 指针。为什么 get() 函数需要我在 currPtr 之前添加 const 而 del() 函数需要不需要我在 currPtr 和 prevPtr 之前添加 const 吗?
我基本上可以将整个帖子恢复到:我应该在何时何地使用 get() 和 del() 函数> 为什么,以及,何时何地我不应该?
【问题讨论】: