大晚上的,屋里热的让人不想睡觉,就发篇今天在下从《C++ Primer Plus》这本宝书中总结的一些关于指针的基础知识吧。这部分知识点比较多,并且涉及的面比较广,所以没总结完, 这两天抽空总结完了我就陆续po上来。
指针这部分学过C都知道,相对容易让人头大 ,尤其是基础并不那么牢固的同学;这部分是C语言中比较容易让人产生说WTF的。指针用途很广泛,从数组,字符串到结构体,函数,类等等,都离不开它的身影,所以对这部分的基础概念的掌握就显得必要性十足了。
最基本的,一定要记住,指针是一个变量,其存储的是值的地址,而不是值本身。
只需对变量应用地址运算符(&),就可以获得其地址。指针名表示的是地址,*运算符被称为间接值或解除引用运算符。如:
int * pointer; int cash = 10; pointer = &cash;
int变量cash和指针变量pointer只不过是同一枚硬币的的两面。变量cash表示值,用&运算符来获得其地址;而变量pointer表示地址,*pointer表示其值。我们说pointer的类型是指向int的指针,或int*。即pointer是指针(地址),而*pointer是int。
指针的危险:
在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。如:
long * ptr; *ptr = 250;
由于ptr没有被初始化,他可能是任何值,不管制是什么,程序都将250赋予这个值的地址。所以在对指针应用解除引用运算符之前,一定要将其初始化为一个确定的、适当的地址。
使用new分配内存:
在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值。new将找到一个长度正确的内存块,并返回该内存块的地址。如:
int *pn = new int;
new运算符根据类型来确定需要多少字节的内存。然后,它找到这样的内存,并返回其地址。接下来将地址赋给pn。
使用new为一个数据对象获得并指定分配内存的通用格式为:
typeName * pointer_name = new typeName;
使用delete来释放内存:
delete用法如下:
int *pn = new int; … delete pn;
这将释放pn指向的内存,但不会删除指针pn本身。记住,一定要配对使用new和delete,否则将发生内存泄露。
也不要尝试释放已经释放的内存块,这样做结果将是不确定的。还不能使用delete来释放声明变量所获得的内存;
只能用delete来释放使用new分配的内存,除了空指针。
使用new创建动态数组:
通常,对于大型数据,应使用new,这正是其用武之地。
int *ptr = new int [10];
new运算符返回第一个元素的地址。当使用完new分配的内存块时,应使用delete释放他们。
delete [] ptr;
方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。
总之,new对应的delete,new[]对应的delete[]。
对于很方便的sizeof运算符,不能将它用于确定动态分配的数组以确定其包含的字节数。
动态数组的使用方式很简单,只要将指针当做数组名来使用即可,也就是说ptr[0]是我们用new创建的动态数组的第一个元素,ptr[1]则是第二个元素,数组和指针基本等价是C++的优点之一。
很有意思的一点是,ptr+1指向的是数组的下一个元素的地址,而不是指向第一个元素的地址加上1,很棒吧,这表明指针算数有一些特别的地方。
今天先说这么多,还没睡的伙计们,赶紧去睡吧,还不准备睡的话,想想自己的头发。古耐!