指针和自由存储空间

计算机程序在存储数据时必须跟踪的3种基本属性:

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

对变量使用地址运算符(&),就可以获得它的位置
*运算符被称为间接值(indirect value)或解除引用(dereferencing)运算符,将其应用于指针,可以得到该地址处存储的值

声明和初始化指针

下面的声明创建一个指针(p1)和一个int变量(p2):

int* p1, p2;

对每个指针变量名,都需要使用一个*

指针的危险

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。

一定要在指针应用解除引用运算符*之前,将指针初始化为一个确定的、适当的地址。

指针和数字
  • 不能简单地将整数赋给指针:
int * pt;
pt = 0xB8000000;    // type mismatch
  • 应通过强制类型转换将数字转换为适当的地址类型:
int * pt;
pt = (int *) 0xB8000000;    // types now match
使用new来分配内存

指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。
new将找到一个长度正确的内存块,并返回该内存块的地址。

int * pn = new int;

new分配的内存块通常与常规变量声明分配的内存块不同。变量nights和pd的值都存储在被称为栈(stack)的内存区域中,而new从被称为堆(heap)或自由存储区(free store)的内存区域分配内存。

使用delete释放内存

使用delete时,后面要加上指向内存块的指针(这些内存块最初是用new分配的):

int * ps = new int;    // allocate memory with new
. . .
delete ps;                // free memory with delete when done

这将释放ps指向的内存,但不会删除指针ps本身。一定要配对地使用new和delete;否则将发生内存泄漏(memory leak)。
不要尝试释放已经释放的内存块;不能使用delete来释放声明变量所获得的内存。

只能用delete来释放使用new分配的内存。然而,对空指针使用delete是安全的。

使用new来创建动态数组

通常,对于大型数据(如数组,字符串和结构),应使用new。

  • 使用new创建动态数组
int * psome = new int [10];    // get a block of 10 ints
.  .  .
delete [] psome;                    // free a dynamic array

new运算符返回第一个元素的地址。
方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。
使用new和delete时,应遵守以下规则。
1.不要使用delete来释放不是new分配的内存。
2.不要使用delete释放同一个内存块两次。
3.如果使用new []为数组分配内存,则应使用delete []来释放。
4.如果使用new []为一个实体分配内存,则应使用delete(没有方括号)来释放。
5.对空指针应用delete是安全的。

使用动态数组

数组和指针基本等价是C和C++的优点之一。
只要把指针当数组名使用即可。
将指针加1后,它将指向下一个元素。

psome = psome + 1;
//psome[0]现在指的是数组的第2个值
double wages[3] = {10000.0, 20000.0, 30000.0};
//和所有数组一样,wages也存在下面的等式
wages = &wages[0] = address of first element of array

将指针变量加1后,其增加的值等于指向的类型占用的字节数。

arrayname[i] becomes *(arrayname + i)
pointername[i] becomes *(pointername + i)

在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数组名是常量。
另一个区别是,对数组应用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度

在C++中,用引号括起的字符串像数组名一样,也是第一个元素的地址

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,576评论 0赞 49
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,758评论 1赞 51
  • (JG-2014-08-20)(前半部分经过网上多篇文章对比整理)(后半部分根据ExceptionalCpp、C+...
    JasonGao阅读 5,784评论 2赞 23
  • 问题:豆瓣图书的查询接口 /v2/book/search之前使用GET方式,自17年6月份左右不能正常调用,现将G...
    jlnbda3488375阅读 1,053评论 0赞 0
  • 突然好想你,不知道你现在在干什么,在睡觉吗?还是在为自己的梦想奔波?我好期待你的样子,是酷酷的呢还是呆呆帅帅的呢。...
    雸鹿阅读 310评论 4赞 2

友情链接更多精彩内容