【c++】初识指针[new&malloc]

来源:互联网 发布:文明5 mac 中文 编辑:程序博客网 时间:2024/06/10 07:39

一.new 的几种基本用法

1.创建一个动态变量

    int *p;
    p=new int;
//new int 操作时的在堆区产生一个int型的动态变量,结果为该动态变量的地址(或指针)。
   *p=1;

2.创建一个一维n位动态数组

    int *p;
    int n;
    p=new int[n]; // 操作在程序的堆区中产生一个动态的一维数组,数组元素的类型是int,返回值为数组的首地址。

3.创建一个n*20的动态数组

    int (*q)[20]; //定义q为一个指向20个int型元素所构成的一维数组的指针。 等价于 typedef int A[20]; A* q;
    q=new int[n][20]; //上面这一段会产生error,因为 无法从int (*)[20]转化为 int *;

4.创建一个m*n的动态数组

    int m,n;
    cin>>m>>n;
    int **p = new int*[n];
    for (int i=0; i<n; ++i) 
    p[i] = new int[m]; //定义一个n*m的二维动态数组

二.malloc的用法

1.malloc在 cstdlib中声明,在程序的堆区中分配一块大小为size的内存空间,并返回该内存空间的的首地址。

2.malloc 函数原型:

   void *malloc(unsigned int size);

3.具体使用

    int *p;

    p=(int *)malloc(sizeof(int));  //创建一个int型的动态变量

    double *q;

    int n;

    q=(double *)malloc(sizeof(double)*n);//创建一个由n个double型元素组成的一位动态数组

    typedef int A[20];

    int *q=(int *)malloc(sizeof(int)*20);    //创建一个n行,20列的动态二维数组变量

三.new与delete的区别

1.new自动计算所需分配空间的大小,delete需要显式的指出。

2.new自动返回相应类型的指针,delete需要做强制类型的转化。

3.如果创建的是动态对象,new会去调用相应对象类的构造函数,而malloc不会。

 

四.动态数组的撤销

1.new创建的delete使之消亡,malloc创建的free使之消亡。

2.delete格式如下:

  int *p=new int;

  delete p;

  int *p=new int[20];

  delete[]p;

3.free的格式如下:

  int *p=(int *)malloc(sizeof(int));

  int *q=(int *)malloc(sizeof(int)*20);

  free(p);

  free(q);

4.delete与free的区别

如果p指向的是对象(或对象数组),则delete p(或delete []p)回去调用对象类的析构函数,而free不会。

5.悬浮指针(dangling pointer)

撤销后,c++编译程序一般不会把指向它的指针变量的值赋为NULL,这样就产生了一个悬浮指针,它指向一个无效的空间。在通过这个悬浮指针来使用相应的动态变量就会产生语义错误。

6.内存泄漏(memory leak)

如果不去撤销它,而指向了别的地方,那个空间就会浪费掉。

原创粉丝点击