美文网首页
指针和自由存储空间

指针和自由存储空间

作者: 霜之幽语 | 来源:发表于2017-11-15 09:35 被阅读11次

计算机程序在存储数据时必须跟踪的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++中,用引号括起的字符串像数组名一样,也是第一个元素的地址

相关文章

  • 指针和自由存储空间

    计算机程序在存储数据时必须跟踪的3种基本属性: 信息存储在何处 存储的值为多少 存储的信息是什么类型 对变量使用地...

  • 13-Go语言指针和方法

    指针 普通数据类型指针 Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间 Go...

  • C语言-指针类型

    改值场景示例 指针就一个作用:能够根据一个地址值,访问对应的存储空间 定义指针变量 [作用:取值 和 赋值]指针变...

  • 第四章 复合类型(6)指针和自由存储空间

    (六)指针和自由存储空间 1.计算机如何存储数据 计算机程序在存储数据时必须跟踪的3种基本属性:信息存储在何处,...

  • Go结构-2

    指针 普通指针 通过指针也可以间接操作指向的存储空间 指向数组的指针 可以通过指针间接操作数组 注意点:Go语言中...

  • iOS内存管理

    1、内存管理原因:(1)内存溢出 内存不够用(2)野指针异常 指针操作了不属于自己的存储空间,指针操作已经...

  • c++ new的用法

    new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100);...

  • 杂记2

    [指针函数与函数指针的区别] 【函数指针】在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间...

  • iOS 的内存管理

    一.内存管理的原因 (1)内存溢出 内存不够用 (2)野指针异常 指针操作了不属于自己的存储空间,指针操作已经销毁...

  • 数据结构学习第一弹 静态链表

    前言 之前学习的那些各种链表都是由指针实现的,而其中的每个节点都是通过有malloc和free来分配和释放存储空间...

网友评论

      本文标题:指针和自由存储空间

      本文链接:https://www.haomeiwen.com/subject/xnkfvxtx.html