堆的首地址和堆的指针

 1 #include "stdafx.h"
 2 #include "iostream"
 3
 4 using namespace std;
 5
 6 class CStu
 7 {
 8 private:
 9     int M_Id;
10     int M_Age;
11 public:
12      void set(int x)
13      {
14          M_Id = x;
15      }
16
17 };
18
19 int main(int argc, char* argv[])
20 {
21     CStu *p = new CStu;        //在堆中创建一块可以存储CStu类的内存空间,并用指针p指向这块内存空间的首地址.
22                                //因为创建的这个堆的类型是CStu型.所以指针的类型也是CStu型.
23     cout << p << endl;         //打印出的是这个申请的堆的首地址.这个地址每次编译后都不一样的.
24     cout << &p << endl;        //打印了存放堆地址的这个内存的单元编号.
25
26 //---把这个堆的指针消除掉----
27     delete p;
28     cout << p << endl;        //删除这个指向堆的指针以后,每次运行,p里面的值得都会改变,有不确定性.
29                             //所以说在这样的情况下,这个p绝对是个迷途指针.
30                             //如果还想找回刚才那个堆的首地址,那是不可能的事,所以一定要注意什么时候用delete.
31
32     cout << &p << endl;        //p还是存在的,并且p的地址一直没改变,只是p里面的内容再不断改变而已.
33
34     return 0;
35 }
时间: 2024-12-16 12:13:09

堆的首地址和堆的指针的相关文章

[转]jna模拟指针开辟空间,数组首地址获取值

http://blog.csdn.net/zhuzhichao0201/article/details/5817819 不是很明白,先记在这里 ------------------------------------------------------------ dll里面给的函数如下:ReadWordBlock(HANDLE hScanner,  BYTE EPC_WORD,  BYTE *IDBuffer,  BYTE mem,  BYTE ptr,  BYTE len,  BYTE *D

C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题

代码如下: #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a+1); int *p1 = a; int *p2 = &a[0]; int *p3 = (int *)(&a); if(p1 == p2){ printf("p1 == p2\n"); }else{ printf("p1 != p2\n"); } i

数组名a、数组名取地址&amp;a、数组首地址&amp;a[0]、数组指针*p

本文链接:https://blog.csdn.net/loongkingwhat/article/details/78910921 数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址.数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的,即a+i= & a[i

通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的. 堆内存与栈内存 ,,堆内存与栈内存能不能共享

创建一个对象都在内存中做了什么事情? 1:先将硬盘上指定位置的Person.class文件加载进内存.2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p.3:在堆内存中开辟一个实体空间,分配了一个内存首地址值.new4:在该实体空间中进行属性的空间分配,并进行了默认初始化.5:对空间中的属性进行显示初始化.6:进行实体的构造代码块初始化.7:调用该实体对应的构造函数,进行构造函数初始化.()8:将首地址赋值给p ,p变量就引用了该实

进程默认堆和额外创建的堆

在<Windows核心编程>第五版的第十八章 <堆> 中提到了进程默认堆和额外创建的堆.这在编程中是十分重要的知识,今天整理一下. 1,堆非常适合分配大量的小型数据.使用堆可以让程序员专心解决手头的问题,而不必理会分配粒度和页面边界之类的事情.因此堆是管理链表和数的最佳方式.但是堆进行内存分配和释放时的速度比其他方式都慢,而且无法对物理存储器的调拨和撤销调拨进行控制. 为了能适应各种硬件平台,如果程序员想要控制物理存储器的调拨和撤销调拨,就不应该使用堆,而应该使用虚拟内存(Virt

通过结构体某个成员的地址计算结构体首地址

给出一个结构体成员的地址计算该结构体的起始地址,据说内核代码中有这样用的,但还没有看到.不过觉得这个题的解决方法还是有一定技巧的,就总结一下.下面是实现的代码. /* Author: Godbach Date: Oct 23, 2008 */ #include <stdio.h> #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element struct stru

计算结构体首地址的技巧

struct ABC { int a; int b; int c; }; +----------+ <------我们需要计算的是这个地址. | a(4Byte) | +----------+ <------这个地址是已知的. | b(4Byte) | +----------+ | c(4Byte) | +----------+ 通过上图可看出,只需要把当前知道的成员变量的地址ptr,减去它在结构体当中相对偏移量(4),就得到了结构体的首地址(ptr-4). 设计一个type类型的结构体,起始

C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放

例:修改字符串的第三个字母为a #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warning(disable:4996) void main() { char *p = (char *)malloc(100); strcpy(p,"123456789"); p = p + 2; *p = 'a'; free(p); system("pause"

笔试算法题(46):简介 - 二叉堆 &amp; 二项树 &amp; 二项堆 &amp; 斐波那契堆

二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者最大堆):一般使用数组构建二叉堆,对于array[i]而言,其左子节点为array[2*i],其右子节点为 array[2*i+1]:二叉堆支持插入,删除,查找最大(最小)键值的操作,但是合并二叉堆的复杂度较高,时间复杂度为O(N):但是二项堆或者斐波 那契堆则仅需要O(logN): 二项树(Binomial