我现在正在编程课上学习链表。以下代码是编译并运行的:
struct Node {
int data;
Node *link;
};
// this function compiles and works
size_t list_length(const Node* head_ptr) {
size_t size{};
for ( ; head_ptr != nullptr; head_ptr = head_ptr->link) {
size++;
}
return size;
}
list_length 函数的以下实现无法编译:
// this function gives a compile times error
size_t list_length(const Node* head_ptr) {
size_t size{};
Node *ptr = head_ptr;
for ( ; ptr != nullptr; ptr = ptr->link) {
size++;
}
return size;
}
我对 const 限定符感到困惑。在这种情况下,我知道这意味着参数不能在函数内更改。我有两个问题:
在list_length有效的版本中,如果head_ptr是一个const变量,为什么for循环可以改变head_ptr的值?随着循环的迭代,head_ptr的值不是在改变吗?
在无法编译的list_length版本中,为什么不能将head_ptr的值赋给新的指针变量?
在第二种情况下,您尝试从
const
指针创建非 const
指针。编译器不会允许这样做,因为它可能会在其他地方引起问题。您可以使用 const
指针进行复制,或使用 const_cast
绕过错误检查。所以要么:
const Node *ptr = head_ptr; // make ptr const to match the source item
或
Node *ptr = const_cast<Node*>(head_ptr); // cast away the const
在此处的情况 2 中,编译器允许进行强制转换,因为您告诉它您知道自己在做什么。