Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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
ptr与&;ptr 我写了一个简单的C++程序,如下所写:< /P> void main() { int *ptr; ptr=new int; *ptr=10; cout<<ptr<<endl; cout<<&ptr<<endl; cout<<*ptr<<endl; }_C++ - Fatal编程技术网

ptr与&;ptr 我写了一个简单的C++程序,如下所写:< /P> void main() { int *ptr; ptr=new int; *ptr=10; cout<<ptr<<endl; cout<<&ptr<<endl; cout<<*ptr<<endl; }

ptr与&;ptr 我写了一个简单的C++程序,如下所写:< /P> void main() { int *ptr; ptr=new int; *ptr=10; cout<<ptr<<endl; cout<<&ptr<<endl; cout<<*ptr<<endl; },c++,C++,这将释放先前在堆中动态保留的内存,但&ptr仍指向该内存位置。为什么 我一直在查看此链接以寻求帮助: 在第二种情况下(&ptr),您将获得指针的地址。是的,指针是一个对象,它又有一个指针。因此,您可以将&ptr分配给int**类型的变量 cout<<ptr<<endl; 这将打印出指针本身的地址 删除ptr。。。这将释放先前在堆中动态保留的内存,但&ptr仍然指向该内存位置。为什么 因为这就是delete所做的:它取消分配ptr指向的任何内容。您可以重复使用ptr指向其

这将释放先前在堆中动态保留的内存,但
&ptr
仍指向该内存位置。为什么

我一直在查看此链接以寻求帮助:

在第二种情况下(
&ptr
),您将获得指针的地址。是的,指针是一个对象,它又有一个指针。因此,您可以将
&ptr
分配给
int**
类型的变量

cout<<ptr<<endl;
这将打印出指针本身的地址

删除ptr。。。这将释放先前在堆中动态保留的内存,但&ptr仍然指向该内存位置。为什么

因为这就是
delete
所做的:它取消分配
ptr
指向的任何内容。您可以重复使用
ptr
指向其他内容,或将其设置为
nullptr
,但必须明确说明。请记住,许多指针可以指向同一个动态分配的内存地址,因此将其中一个指针设置为
nullptr
并不能保证安全性(感谢@hvd澄清了这部分问题)

注*:指针是“特殊的”,因为它们包含的值是地址。但和其他变量一样,它们也有自己的地址。如果用非指针类型表示,这可能更清楚:

int i = 42;
std::cout << i << std::endl;  // prints value of i, i.e 42.
std::cout << &i << std::endl; // prints address of i. 
inti=42;

std::cout因此将打印以下内容:

cout<<ptr<<endl;  // Address pointed by ptr

cout<<&ptr<<endl;// Address of ptr

cout<<*ptr<<endl; // Value conatined in address pointed by ptr

cout运算符
至少有三种可能的含义:

  • 在类型名称后面,例如
    int&
    int&
    之后,它会将类型升级为引用<代码>int&p=q表示p是对整数的引用

  • 在变量名称或值之前,表示
  • 的地址<代码>整数*p=&q
    表示p是指向整数的指针,其值是变量q的地址(其中q是整数)

  • 一点一点的聪明

  • 那么你的

    cout << &ptr << endl;
    

    cout
    ptr
    是指向您在堆上分配的新
    int
    的指针

    &ptr
    是指向
    ptr
    本身的指针,它是在main函数调用的堆栈上创建的


    delete ptr上,您在堆上分配的int未分配
    &ptr
    有效,它指向堆栈上存在的
    ptr
    指针变量。您仍然可以使用
    ptr
    指向类型为
    int

    main()
    的其他内容,必须始终
    返回
    int
    @约翰西韦伯:你们在返回的周围加上反勾,表示它是代码,但在这种情况下,你们的声明是错误的。它必须返回
    int
    ,但它不需要
    return
    语句。我认为标准不需要返回,但如果函数返回的类型实际上不执行返回,许多编译器会抱怨。虽然我同意,但主要需要声明返回类型为int.void,这是一种不可接受的奇怪现象,应该予以消除。@hvd:你说得对。。。我应该说
    main()
    必须始终具有
    int
    @RichardPlunkett的返回类型:它们是这样的,因为在其他函数中
    return
    是必需的。但是,<代码>主< /代码>是一个特殊的情况,C++明确允许在<代码>主< <代码>中省略<代码>返回<代码>语句。我认为最后的“为什么?”是关于为什么代码> PTR < /代码>没有重置为空指针,或类似的事情。可以有任意数量的变量指向同一个地址,因此无法可靠地工作到有用的程度,但OP可能没有意识到这一点。ptr和&ptr之间的区别很明显。但问题是,“删除”并不是取消分配“ptr”指向的内容。例如,当我打印“ptr”时,即使在执行了“delete ptr”之后,它也会给出相同的地址“ptr”指向,除非我显式地执行ptr=NULL。那么为什么要删除呢?为什么我们不依赖于将其置零???@user3054062
    delete
    正在取消分配
    ptr
    指向的内容。这就是它的工作。但它不会使
    ptr
    成为
    nullptr
    ,而是使它指向同一个位置。进入这个地方将是未定义的行为。因此,在调用
    delete
    之后要使用
    ptr
    ,您必须将其指向有效位置,或者将其设置为
    nullptr
    (或者
    0
    或者
    NULL
    您没有C++11)。好吧,“ptr”和“&ptr”问题很清楚,但仍然没有解决的问题是“delete”除非执行ptr=NULL,否则不会取消分配ptr指向的任何对象。例如,我编写了代码:void main(){int*ptr;ptr=new int;cout
    ptr
    是一个指针,当你
    delete
    它指向的东西时,指针不受影响。
    &ptr
    仍然是它的地址。请看我的答案。在你的上下文中,
    delete
    相当于他们关上大门时——它既不会把你的纸擦干净,也不会带走我t离开,但它确实允许机场使用该登机口进行另一次航班。
    cout<<&ptr<<endl;
    
    cout << &ptr << endl;