C++Primer之4.7指针和自由存储空间

1.声明和初始化指针

指针声明必须指定指针指向的数据的类型。

int * p_updates; //p_updates的类型是指向int的指针  p_updates是指针(地址),而*p_updatesp_updates是int,而不是指针。
# *运算符两边的空格是可选的
int *ptr;  //C程序员格式 强调的*ptr是一个int类型的值
int* ptr;  //c++程序员格式 强调的是int*是一种类型--指向int的指针。
#在哪里添加空格对于编译器来说没有任何区别  也可以int*ptr
int* p1,p2;  //创建一个指针(p1)和一个int变量(p2)   每个指针变量名,都需要使用一个*。

可以在声明语句中初始化指针,被初始化的是指针,而不是它指向的值。

int hhiggens=5;
int * pt=&higgens;  // 将pt(而不是*pt)的值设置为&higgens

2.指针的危险

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。为数据提供空间是一个独立的步骤。比如下面没有初始化fellow:

long * fellow; //create a pointer to long
*fellow=223323;//place a value in never-never land

会导致一些最隐匿、最难以跟踪的BUG。

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

3.指针和数字

要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型:

int * pt;
pt=(int *) 0xB8000000;//types now match 
#赋值语句的两边都是整数的地址,所以这样赋值有效。Pt是int值的地址并不意味着pt本身类型是int。

4.使用new来分配内存

将指针初始化为变量的地址:变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供一个别名。指针在运行阶段分配未命名的内存以存储值,在这种情况,只能通过指针来访问内存。C++可以用C的malloc()分配内存,也可以用new运算符来分配。

在运行阶段为一个Int 值分配未命名的内存,并使用指针来访问这个值,程序员要告诉new,需要为那种数据类型分配内存:new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任是将地址赋给一个指针。

int * pn=new int;
# new  int告诉程序,需要适合存储int的内存,new运算符根据类型来确定需要多少字节的内存,然后找到这样的内存,并返回其地址。接下来,将地址赋给pn,pn是被声明为指向int的指针。现在pn是地址,而*pn是存储在那里的值将这种方法与将变量的地址赋给指针进行比较:
int higgens;
int * pt=&higgens;
#在pn /pt这2种情况下,都是将一个Int变量的地址付给了指针。在第二种情况,可以通过名称higgens来反复问该int,在第一种情况,只能通过该指针访问。pn指向的内存没有名称,就定义pn指向的是数据对象---为数据项分配的内存块。pn指向的内存不是变量。

为一个数据对象(可以是结构,也可以是基本类型)获得指定分配内存的通用格式如下:

typeName *pointer_name =new typeName;  

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

5.使用delete释放内存

使用delete时,在后面加上指向内存块的指针:

int * ps = new int;
.....
delete ps;

这将释放ps指向的内存,但不会删除指针ps本身。例如,可以将ps重新指向另一个新分配的内存块。一定要配对地使用new和delete;否则将发生内存泄漏。即被分配的内存再也无法使用了。如果内存泄漏严重,则程序将由于不断寻找更多的内存而终止。

不要尝试释放已经释放的内存块,后果不确定。不能使用delete来释放声明变量所获得的内存。

int * ps = new  int; 
delete ps;
delete ps; //not ok now
int jugs=5;
int 8 pi=&jugs;
delete pi; //not allowed,memory not allocated by new

注意:使用delete的关键在于,将它用于new分配的内存。这并不意味着要使用用于new的指针,而是用于new 的地址:

 int * ps= new int;//allocate memory
int *pq =ps;  // set second pointer to same block
delete pq; //delete with second pointer

一般不要创建两个指向同一个内存块的指针,,因为它会增加错误的删除同一个内存块两次的可能性。

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

(1)创建动态数组

   数组的元素类型和元素数目告诉New,必须在类型名后加上方括号,其中包含元素数目。

 int * psome =new int [10];//new运算符返回第一个元素的地址。该地址赋给指针psome。

释放delete:

delete [] psome;

使用new和delete遵守的规则:

  • 不要使用delete来释放不是new 分配的内存。
  • 不要使用delete释放同一个内存块两。‘
  • 如果使用new[]为数组分配内存,则应使用delete[]来释放。
  • 如果使用new[]为一个实体分配内存,则应使用delet(没有方括号)来释放。
  • 对于空指针使用delete是安全的。

为数组分配内存的格式:

type_name * pointer_name=new type_name [num_elements];

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值