PTR 和 &ptr 之间的区别
Difference between ptr and &ptr
我写了一个简单的C++程序,如下所示:
void main()
{
int *ptr;
ptr=new int;
*ptr=10;
cout<<ptr<<endl;
cout<<&ptr<<endl;
cout<<*ptr<<endl;
}
前两种说法有什么不同。两人都给出了地址。由于新操作符在堆中保留了一个内存,因此哪个语句给出了堆中动态保留内存的地址ptr
或&ptr
。现在,如果我们这样做:
delete ptr;
这将释放先前在堆中动态保留的内存,但&ptr
仍然指向该内存位置。为什么?
我一直在查看此链接以寻求帮助:https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_cpp_dynamic-memory.php
cout<<ptr<<endl;
这将打印出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.
因此打印以下内容:
cout<<ptr<<endl; // Address pointed by ptr
cout<<&ptr<<endl;// Address of ptr
cout<<*ptr<<endl; // Value conatined in address pointed by ptr
在第二种情况下(&ptr
),您将获得指针的地址。是的,指针是一个对象,它又有一个指针。因此,您可以将&ptr
分配给类型为int **
的变量。
&
运算符至少有三种可能的含义:
-
当跟随类型名称(例如
int &
或int&
)时,它会将该类型提升为引用。CCD_ 17表示p是对整数的引用。 -
在变量名称或值之前,表示
address of
。int* p = &q;
意味着p是一个指向整数的指针,它的值是变量q的地址(其中q是一个整数)。 -
有点明智。
所以你的
cout << &ptr << endl;
点击#2,意思是"打印ptr的地址"。
ptr
是指向您在堆上分配的新int
的指针。
&ptr
是指向ptr
本身的指针,它是在main的函数调用中在堆栈上创建的。
在delete ptr
上,您在堆上分配的int是未分配的。&ptr
有效,它指向堆栈上存在的ptr
指针变量。您仍然可以使用ptr
来指向其他类型的int
。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?