用指针工作的C++
我不明白为什么即使deletenode函数将x设置为NULL,它也会输出123用指针工作的C++,c++,C++,我不明白为什么即使deletenode函数将x设置为NULL,它也会输出123 #include <iostream>; using namespace std; struct node {int value; struct node *left,*right,*parent;}; void deletenode(node *a) { delete a; a=NULL; } int main(int argc, const char * argv[]) { n
#include <iostream>;
using namespace std;
struct node {int value; struct node *left,*right,*parent;};
void deletenode(node *a) {
delete a;
a=NULL;
}
int main(int argc, const char * argv[])
{
node *x = new node;
x->value=123;
deletenode(x);
if (x!=NULL) cout << x->value;
}
您有以下签名:void deleteNodeNodeNodeNode*a。将指针x传递给函数。指针值被复制。在函数内部,您可以通过a=NULL写入本地指针值来修改它 但是,该修改发生在副本上。原作未受影响。请注意,对于delete,情况并非如此,因为delete不修改指针,而是修改或清除指针对象 表面解决方案是通过引用传递指针值:
void deletenode(node*& a)
然而,有一个共识是,在删除后设置指向nullptr或NULL的指针并没有真正的帮助,因此通常不会这样做。因此,我将用一个简单的deleteX替换您对deletenode的整个调用;声明。您有以下签名:void deleteNodeNodeNodeNodeNode*a。将指针x传递给函数。指针值被复制。在函数内部,您可以通过a=NULL写入本地指针值来修改它 但是,该修改发生在副本上。原作未受影响。请注意,对于delete,情况并非如此,因为delete不修改指针,而是修改或清除指针对象 表面解决方案是通过引用传递指针值:
void deletenode(node*& a)
然而,有一个共识是,在删除后设置指向nullptr或NULL的指针并没有真正的帮助,因此通常不会这样做。因此,我将用一个简单的deleteX替换您对deletenode的整个调用;语句。因为使用delete实际上是将内存标记为空闲并准备好重新使用,但该区域的内容可能保持不变因为使用delete实际上是将内存标记为空闲并准备好重新使用,但是该区域的内容可能保持不变您可以通过值将指针传递到函数-这意味着您不会看到函数之外的更改。尝试通过引用传递它。您通过值传递指向函数的指针-这意味着您不会看到函数之外的更改。尝试通过引用传递它。虽然您已成功删除了要删除的对象,但指针本身会通过复制到变量“a”的值传递给deletenode。因此,即使函数中的变量“a”为空,变量“x”仍指向现在已删除的内存。虽然您已成功删除了要删除的对象,但指针本身会通过复制到变量“a”的值传递给deletenode。因此,即使函数中的变量“a”为空,变量“x”仍然指向现在已删除的内存。非常感谢,但实际上我在删除二叉树中的节点时遇到了问题,因此我不能按原样使用delete。非常感谢,但实际上,我在删除二叉树中的节点时遇到了一个问题,所以我不能按原样使用delete。指针不是引用。请先读一本好的C++初稿,然后再问一些小问题。请先阅读一本好的C++初级书籍,然后再问一些琐碎的问题。
#include <iostream>
template<typename T>
void destroy(T*& ptr) {
delete ptr;
ptr = NULL;
}
template<typename T>
struct node {
node(T t) : value(t) { }
~node() {
delete left;
delete right;
}
T value;
struct node *left,*right,*parent;
};
int main(int argc, const char * argv[]) {
node<int> *x = new node<int>(123);
destroy(x);
if (x != NULL) {
std::cout << x->value << '\n';
}
}