Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用指针工作的C++_C++ - Fatal编程技术网

用指针工作的C++

用指针工作的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

我不明白为什么即使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[])
{
    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';
  }
}