指针与内存的分配

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是安全的。
原文地址:https://www.cnblogs.com/sjxbg/p/5671340.html