num*_*l25 3 c++ visual-studio-2008 visual-studio visual-c++
好吧,所以我确实发现了一些几乎相似的问题,但实际上他们对指针更加困惑.
在上面的链接中,他们说如果你声明一个指针它实际上保存在堆上而不是堆栈上,无论它在何处被声明.这是真的 ??还是我误会了?我认为无论指针还是非指针,如果它是一个全局变量,它就和应用程序一样长.如果它是一个局部变量或在循环或函数内声明,它的生命只与其中的代码一样长.
变量本身存储在堆栈或DATA段中,但它在分配后指向的内存new位于堆内.
void main()
{
int* p; // p is stored on stack
p = new int[20]; // 20 ints are stored on heap
}
// p no longer exists, but the 20 ints DO EXSIST!
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
需要区分指针(保存内存位置的变量)和指针指向的对象(指针保存的内存地址处的对象)。指针可以指向堆栈或堆上的对象。如果使用new来分配对象,它将在堆上。同样,指针可以存在于堆上。如果您在函数体中声明它,那么它将是一个局部变量并存在于本地存储中(即在堆栈上),而如果它是一个全局变量,它将存在于应用程序数据部分的某个位置。您还可以拥有指向指针的指针,类似地,可以在堆上分配一个指针(并有一个指向该指针的指针)等。请注意,虽然我引用了堆和堆栈,但仅在 C++ 中提到本地/自动存储和动态存储......它没有谈到实现。但实际上,local=stack 和dynamic=heap。
void func()
{
int x = 1;
int *p = &x;
}
// p goes out of scope, so does the memory it points to
void func()
{
int *p = new int;
}
// p goes out of scope, the memory it points to DOES NOT
void func()
{
int x = 1;
int **pp = new int*;
*pp = &x;
}
// pp goes out of scope, the pointer it points to does not, the memory it points to does
Run Code Online (Sandbox Code Playgroud)
等等。指针是包含内存位置的变量。像所有变量一样,它可以在堆或堆栈上,具体取决于它的声明方式。它的值——内存位置——也可以存在于堆或栈中。
通常,如果你静态分配一些东西,它就在堆栈上。如果你动态分配一些东西(使用 new 或 malloc),那么它就在堆上。一般来说,您只能使用指针访问动态分配的内存。这可能是混淆出现的地方。
| 归档时间: |
|
| 查看次数: |
7103 次 |
| 最近记录: |