C++学习之符合类型(4)

以下开始学习指针:

首先我们得想三个问题:

  • 信息存储在何处。
  • 储存的值为多少。
  • 存储的类型是什么。

你一定使用过一种策略来解决上述问题,定义一个简单的变量。声明语句指出了值的类型和符号名,还让程序为值分配内存,并在内部跟踪该内存单元。

下面来看另一种策略,它十分重要。这种策略以指针为基础,指针是一个变量,他存储的是值的地址,而不是值的本身。想要用它只需要对变量应用地址运算符(&)。例如,如果home为一个变量,则&home是它的地址。

例如下面的程序:

输出结果:

显示地址的时候,该实现的cout使用十六进制表示法,因为这是最常用与描述内存的表示法。这些地址值都是有意义的。我的电脑是首先存储的cpus,再存储的donuts。两个地址的差是16.在我的电脑上double类型为16个字节。当然在其他系统给定的地址值可能是不同的或者存储的顺序不一样。

处理存储数据的新策略刚好相反,将地址视为指定的量,而值视为派生量。指针用于存储值的地址,所以指针名表示的是地址。*运算符被称为间接值或解除引用运算符,将其应用于指针,可以得到该地址处存储的值。例如,假设manly是一个指针,则manly表示的是一个地址,而*manly表示存储在该地址处的值。

1.声明指针变量

int * p_updates;

这里表明,*p_updates的类型为int。由于*运算符被用于指针,因此p_updates变量本身必须是指针。

可以在声明指针的同时初始化指针

int higgens = 5;

int * pt = &higgens;

2.指针的危险

例如:

long *fellow;

*fellow=2333;

fellow确实是一个指针,但是它指向哪里喃?上述代码没有将地址赋给fellow。那么2333将被放到哪里?我们不知道由于fellow没有被初始化,它可能的有任何值。不管值是什么,程序都将它解释为存储2333的地址。如果fellow的值碰巧为1200,计算机将把数据放到地址1200,即使这恰好是程序代码的地址。fellow指向的地方很可能并不是所要并不是所要存储2333的地方这样会导致一些最隐蔽,最难以跟踪的bug。

3.要将数字值作为指针地址来使用,应通过强制类型转化将数字转换为适当的地址类型。

int * pt;

pt = (int *)0xB8000000;

4.使用new来分配内存

前面我们都将指针初始化为变量的地址;变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名。指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在C语言中,可以用库函数malloc()来分配;在c++仍然可以这样使用;在C++中更适合使用——new运算符

程序员要告诉new,需要为那种数据类型分配内存;new将找到一个长度正确的内存块,并返回内存块的地址。

int *pn = new int;

new int 告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少的字节的内存。然后,它找到这样的内存,并返回其地址。接下来,将地址赋给pn,pn是被声明为指向int的指针。现在,pn是是地址,而*pn是存储在哪里的值。

int higgens;
             int * pt = &higgens;
             在这两种情说用下,都是将一个的变量的地址赋给了指针。 在第二种情况下,可以通过higgens来访间该int,在第一种情况下, 则只能通过该指针进行访问。这引出了一个问题,pn指向的内存没有名称,如何称呼它呢?我们说pn指向个数据对象, 这里的“对象”不是“面向对象编程“中的对象而是一样“东西”。术语“数据对象”比“变量”更通用,它指的是为数据项分配的内存块。因此,变量也是数据对象,但pn指向的内存不是变量。乍一看,处理数据对象的指针方法可能不大好用,但它使程序在管理内存方面有更大的控制权。

为一个数据对象获得并指定分配内存的通用格式如下:

typeName *pointer_name = new typeName;

需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针。

5.使用delete释放内存

当需要内存的时候,可以使用new来请求。另一个方面是delete,它使的在使用完内存后,能够将其归还给内存池。

int * ps = new int;

......

delete ps;

这将释放ps所使用的内存,但是不会删除ps本身。可以很好的配对地使用new和delete,避免将发生的内存泄漏,也就是说,被分配的内存再也无法使用了。如果内存泄漏严重,则程序将由于不断寻找内存而终止。

不要尝试释放已经释放的内存块。

6.使用new来创建动态数组

new一般用于处理大型数据(数组、字符串和结构体)。例如:如果通过声明来创建数组,则在程序被编译时将为它分配内存空间。不管程序最终是否使用数组,数组都在那里,它占用了内存。在编译时给数组分配内存被称为静态联编,意味着数组是在编译时加入到程序中的。但使用new时,如果在运行阶段需要数组,则创建它;如果不需要,则不创建它。还可以在程序运行时选择数组的长度。这叫动态联编,意味着数组是在程序运行时创建的。这叫动态数组。

在C++中建立动态数组很容易;只要将数组的元素类型和元素数目告诉new即可。必须在类型名后加上方括号,其中包含元素数目。例如,要建立一个包含10个int元素的数组,可以这样做:

int * psome = new int [10];

new运算符返回第一个元素的地址。在这个例子中,该地址被赋给指针psome。

当程序使用完new分配的内存块时,应使用delete释放它们。然后,对于使用new创建的数组,应使用另一种格式的delete来释放。

delete []psome;

方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。

注意:使用new和delete时,应遵守以下规则:

  • 不要使用delete来释放不是new分配的内存。
  • 不要使用delete释放同一个内存两次
  • 如果使用new[]为数组分配内存,则应使用delete[]来释放
  • 如果使用new为一个实体分配内存,则应使用delete来释放
  • 对空指针应用delete是安全的

使用动态数组——只要把指针当成变量名使用就好了。例如第二个元素psome[1],依次类推;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值