指针与内存的分配
1.指针可以这样理解:
int *ptr; -----> 强调*ptr是一个int类型的指针。
int* ptr; ----->强调的是,int*是一种类型-----指向int的指针。
注意: int* p1,p2; //该声明创建一个指针p1和一个int变量p2。
2.指针的危险
- 计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。为数据提供空间是一个独立的步骤,很重要。
long* fellow; *fellow = 123;
/*fellow是一个指针,无指向,该代码没有将地址赋给fellow,导致fellow没有被初始
化,其实就是一个野指针。*/
注意:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
3.指针与内存
- 指针可不是整型,虽然计算机通常把地址当作整数来处理,整数描述的是可加减乘除的数字,而指针描述的是位置。
- c++使用new来分配内存(c语言中用的是三个loc)
- 程序员要告诉new,需要为哪种数据类型分配内存,new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任就是将该地址赋给一个指针。
(1) int * pn = new int;
(2) int higgens;
int * pt = &higgens;
(1)和(2)都是将一个int变量的地址赋给了指针。在(2)中可以通过名称higgens来
访问该int,在(1)中只能通过该指针进行访问。pn指向的内存没有名称,pn指向一个数据对象,
此对象不是oop中的对象,而是一样东西,数据对象比变量更通用,指的是数据项分配的内存块。
- 使用delete释放内存(如果不将new分配的内存释放,发生内存泄漏)--------> delete pn; new并不意味着要使用用于new的指针,而是用于new的地址。
- 一般来说,不要创建两个指向同一个内存块的指针,因为这将增加错误的删除同一个内存块两次的可能性。
4.适用new创建动态数组
-
int * psome = new int [10]; new运算符返回第一个元素的地址。对于new创建的数组,释放则: delete [] psome; //方括号告诉程序,释放整个数组,而不仅仅是指针指向的数组。
-
int * psome = new int [10]; 可以将它看做是一根指向该元素的手指。假设int占4个字节,则将手指沿正确的方向移动
4个字节,手指将指向第2个元素。共10个元素,这就是手指移动的范围,因此,new语句
提供了识别内存块中每个元素所需的全部信息。 - 使用new与delete注意事项
-
- 不要使用detlete来释放不是new分配的内存。
- 不要使用delete释放同一个内存块。
- 如果使用new[]为数组分配内存,则应使用delete[]来释放。
- 如果使用new[]为一个实体分配内存 ,则应使用delete(无方括号)来释放。
- 对空指针应用delete是安全的。
人怂胆子小,手拿大刀跑。