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;
coutptr
是指向您在堆上分配的新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。那么为什么要删除呢?为什么我们不依赖于将其置零???@user3054062delete
正在取消分配ptr
指向的内容。这就是它的工作。但它不会使ptr
成为nullptr
,而是使它指向同一个位置。进入这个地方将是未定义的行为。因此,在调用delete
之后要使用ptr
,您必须将其指向有效位置,或者将其设置为nullptr
(或者0
或者NULL
您没有C++11)。好吧,“ptr”和“&ptr”问题很清楚,但仍然没有解决的问题是“delete”除非执行ptr=NULL,否则不会取消分配ptr指向的任何对象。例如,我编写了代码:void main(){int*ptr;ptr=new int;coutptr
是一个指针,当你delete
它指向的东西时,指针不受影响。&ptr
仍然是它的地址。请看我的答案。在你的上下文中,delete
相当于他们关上大门时——它既不会把你的纸擦干净,也不会带走我t离开,但它确实允许机场使用该登机口进行另一次航班。
cout<<&ptr<<endl;
cout << &ptr << endl;