在堆栈上创建一个指针
Create a pointer on the Stack
我正在学习c++,我有一个关于指针的问题。
我有这样的代码:
int* max = new int;
*max = 0;
我想,我在堆上创建了一个指针(如果我不对,请告诉我)。
一个问题:
是否有一种方法来创建一个初始化的指针与一个指令?(现在,我使用两个指令)。
另一个问题:
如何在堆栈上创建指针?
我看到这样的代码:
int myVar = 20;
int* pVar = &myVar;
我想我还没有在堆栈上创建一个指针,但我认为这是唯一的方法,不创建一个指针在堆上
我是c++开发的新手。
int* max = new int;
上面这行在堆栈上创建了一个指针,并用存储在堆上的整数初始化它。当表达式中涉及到new
时,它将返回一个指向其动态创建的操作数的指针:
c++ 11标准第5.3.4/2段:
由
new
-表达式创建的实体具有动态存储时间(3.7.4)。[——]如果实体是非数组对象,new-expression返回指向所创建对象的指针。如果是数组,则new
-表达式返回指向数组初始元素的指针。
int myVar = 20;
int* pVar = &myVar;
在本例中,指针及其值都存储在堆栈中。赋值中没有涉及new
表达式,因此在这种情况下不会在堆上创建任何内容。
如果想在一行中初始化指向对象的值,必须对进行值初始化,如下所示:
int* max = new int(5);
或者在c++ 11中你可以使用uniform-initialization:
int* max = new int{5};
同样重要的是,您要记住使用new
创建的delete
。由于内存是动态分配的,因此它的生命周期不依赖于创建它的作用域。如果您忘记delete
,您的程序将获得内存泄漏。
delete max;
如果max
是指向由new
-表达式创建的数组的指针,则使用delete[]
:
delete[] max;
注意:如果指针没有被new
-表达式初始化,则不需要删除
通常建议您使用容器来管理内存。像std::unique_ptr
这样的东西就可以。一旦它的析构函数被调用,它所保存的内存将被删除:
std::unique_ptr<int> max{new int{5}};
在c++ 14中有make_unique
:
auto max = std::make_unique<int>(5);
指针是普通变量,其内容是一个内存地址。该内存可以是堆内存或堆栈内存。不要把指针和它所指向的内存空间搞混了。
第一个代码在堆上分配空间,堆可以容纳int类型。将指向该内存的指针存储在堆栈上。 第二段代码在栈上分配空间,可以容纳int类型。将指向该内存的指针存储在堆栈上。所以两个指针都在堆栈上,但是只有第二个指针指向堆栈。
在这两种情况下,分配的类型都是基本类型。默认情况下,基本类型不会初始化,除非您立即为其赋值(您的第二段代码),或者使用构造函数语法,该语法也适用于堆分配的值:
int *max = new int(0);
同样的语法可以在你的第二段代码中使用,顺便说一下:int myVar(20);
如果你感兴趣的话:你也可以在堆上定义指针。int*
是指向int
s的指针类型,所以直接在堆上分配这种类型:
new int*();
这个表达式返回一个int**
,然后您可以将其存储在某个地方。同样,您通常将这个指针对指针存储在堆栈上:
int **pointerToPointer = new int*();
与int
一样,可以在new-expression中将int*
初始化为指向int的指针(这里是上面的max
指针):
int **pointerToPointer = new int*(max);
现在你有两个指针具有相同的地址:max
(堆栈上的指针)和使用pointerToPointer
指向堆上的某个指针,即以下保持(I解引用' pointerToPointer,这导致存储在该指针后面的值,这是一个指向int的指针):
max == *pointerToPointer
是否有一种方法来创建一个初始化的指针与一个指令?
yes:
int * a = new int(20); //initialized with 20;
如何在堆栈上创建指针?
int myVar = 20;
int* pVar = &myVar; //copied your code snipped It's alright
你的第一个例子
int* max = new int;
*max = 0;
确实在堆上创建了一个新的int类型,变量max
保存了一个指向该int类型的指针。如果你打算使用这个,你将不得不使用delete max;
,当你不再需要它,以避免内存泄漏。
第二个例子
int myVar = 20;
int* pVar = &myVar;
在堆栈上创建一个int型,pVar
现在是一个指针,指向int型存储在内存中的地址。然而,如果你使用这个,你不必删除pVar
,因为它不在堆上(你没有使用new
关键字)。
这两个变量(在堆和堆栈上创建)之间的主要区别是堆栈变量在离开作用域时将被自动删除。作用域由花括号{}
定义:
int* somefnc()
{
int e1
{
int* e2 = new int(0);
int e3 = 0;
} // int e3 gets automatically deleted here
return e2;
} // e1 gets automatically deleted here
// e2 still exists and has to be manually deleted.
指针的一个优点是在处理数组时。如果要在堆栈上创建x个元素的字符数组,则必须在编译时知道元素的数量。如果你想在运行时创建一个包含x个元素的字符数组,并且元素数量是动态的,你必须使用char* ar = new char[x];
,然后通过ar[x-1] = 'n';
访问它。
为了在堆上创建变量时初始化它,您可以使用var x = new var(args);
您可以将该值作为参数传递给堆初始化内存。
int *iptr = new int(20);
初始值为20;
stack:包含本地变量。当你创建一个指针并用局部对象赋值它时。它指向堆栈中的变量。我们不是在堆上创建指针.
- 修改函数中的指针(将另一个指针作为参数传递)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 更改一个指针后更改乘法对象
- 从另一个指针指向函数的指针
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 我不明白我的错误需要返回一个指针数组
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- 将指针分配给另一个指针时会发生什么情况?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 类的成员应该是一个指针
- 隐式指针变量,在自动定义中具有另一个指针变量
- 利用双重链接列表中的下一个指针
- 你能把一个指针投射到数组中吗?