阅读c++ primer plus指针部分内容

4 篇文章 0 订阅
1 篇文章 0 订阅

最近一直在阅读c++ primer plus中文第六版,不愧是c++经典教程,让我这个小白从几乎0基础入手c++。翻译的可以,当然原版作者更是大神。
指针部分,介绍指针的略过。主要纪录细节问题

1.指针与数字

不能简单地将整数赋值给指针。因为指针和整数是截然不同的类型,虽然计算机通常将地址当做整数处理,但是指针用于描述位置,不等于整数。
c99发布之前的c语言运行给指针直接赋值整数

例如:

int* pr;
pr = 0xB8000000;

但是c++要求很严格,编译器对此会报错。如果要使用,必须强制类型转换

int* pr;
pr = (int*)0xB000000;//可行的

同时,注意虽然会有各种类型的指针,如:

int* pr1;
char* pr2;
long* pr3;
double* pr4;

但是我们始终要牢记,指针是对应类型的地址不意味着指针本身是对应类型
例如:int* pr 中pr不是int型,他是指向int类型数据的指针,*pr才是int型
同时,我们应当了解,int* pr1;char* pr2;long* pr3;double* pr4;
这里的pr1,pr2,pr3,pr4虽然是指向不同类型的指针,但是他们都是相同字节大小。例如64位系统中指针大小为8字节值。千万不要混淆,误以为pr1所占字节的大小和int类型所占字节大小相同,pr2所占字节和char类型所占字节大小相同

2.new分配内存

在c语言中我们使用malloc分配内存,c++中可以继续使用,但是更推荐new运算符
例如:int* pr = new int; new int告诉程序,需要分配一个适合int的内存,例如64位系统中int占4个字节
那么就需要连续的四个字节的内存来分配给int。然后将该地址赋值给pr(可以理解为将连续四个字节地址的第一个字节地址编号赋值给pr)
我们可以对比如下两种方式

//方式一:
int higgens;
int* pr = &higgens;

//方式二:
int* pr = new int;

在第一种方式,可以通过*pr(即解引用指针)来访问数据,也可以通过higgens访问数据。但是第二种只能通过*pr来访问数据。
同时,new分配的内存块通常与常规变量分配的内存块不同。常规变量的值都存在栈中,而new从堆中或者自由存储区的内存区域分配内存。这部分内容,看Java或者c++或者c的程序内存分配就行。结合程序和内存图,可以更快看懂。

3.delete释放内存

要使用内存时,可以使用new来请求,另一方面,可以使用delete来释放内存,这样可以更有效使用宝贵的内存。
使用方法如下:

int* ps = new int;//通过new方式分配内存
...			//使用内存
delete ps;//释放内存

注意:1.这里释放ps指向的内存,但不会删除ps本身,因为ps本身所在空间是栈中(属于常规变量)
此后,我们可以将ps指向另一个新分配的内存块。
2.尽量配对使用new和delete
3.不要尝试释放已经释放的内存块,c++标准说这样做的结果是不确定的,意味着什么情况都可能发生。同时也不能用delete来释放声明变量所获得的内存
例如:

int* ps = new int;//分配内存
delete ps;//可以的,new与delete配对使用
delete ps;//不可以,不能delete一个已经delete后的内存块
int ju = 5;//给变量ju初始化为5
int* j = &ju;//给int*指针赋值ju的地址
delete j;//不允许的,这里的指针j所指向的地址不是通过new获取的,而是声明变量的地址,也就是说这个地址很可能在栈中

4.通过new创建动态数组

所谓动态数组,往往应用于程序的运行阶段,如果需要就创建,不需要就不创建,而且大小也由程序决定。区别于在编写程序和编译阶段就固定大小的静态数组
应用:

int* psome = new int[10];//创建一个包括10个int元素的数组

psome被赋值了这10个元素中第一个元素的地址
如果想delete释放,则用如下格式:delete [] psom; []告诉程序,应该释放整个数组,而不是指针指向的元素,前面我们说过,指针psome指向的是10个元素的第一个元素的地址,而现在我们要释放10个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值