[学习笔记]C和C++中指针的基础知识点(一)

       大晚上的,屋里热的让人不想睡觉,就发篇今天在下从《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,很棒吧,这表明指针算数有一些特别的地方。


       今天先说这么多,还没睡的伙计们,赶紧去睡吧,还不准备睡的话,想想自己的头发吐舌头。古耐!


你可能感兴趣的:(C++,c,C语言,学习笔记,指针)