1. 程式人生 > >引用及c++動態記憶體開闢new malloc

引用及c++動態記憶體開闢new malloc

一引用:

如果&左邊有型別則為引用,沒型別則為取地址。

1引用必須初始化

2引用定義是引用了誰就不能在改變

3 引用只有一級引用沒有多級(c++11有左引用和右引用)

4 引用變數,永遠訪問的是引用記憶體(不能訪問4位元組的指標記憶體)

結論:

1 引用必須初始化

2引用初始化的值必須能取地址

例如;int &b = a;

     Int &b =10; 錯誤

1普通的引用不能引用常量,如果引用,必須用常引用才能引用常量(因為會對立即數產生一個臨時量)

Const int &b=10;

Const Int  tmp =10;

  Const int &b = tmp;

1常引用和const 指標才能引用或者指向常量;

C++中動態記憶體的分配

 Newmalloc有什麼區別?

1 Malloc勢函式,new是運算子

2 Malloc 結果要進行型別的強轉(malloc 的返回值為void * new不需要強轉。

3 amlloc 申請記憶體失敗時返回NULL空指標,靠返回值和NULL指標來判斷,new申請失敗時丟擲一個錯誤bad_alloc 異常

4 malloc 只能分配記憶體,new可以分配記憶體,還可以初始化int b =new int (10);

5  new 的底層還是呼叫malloc 函式.

Delete free 的區別

1 delete 的底層呼叫的還是

free 來釋放的

2 delete釋放陣列記憶體時,在delete和指標之間加[ ]

3 delete是屬於運算子 free是函式(libc.so C語言的庫函式)

4 free 釋放記憶體的時候,不區分單個元素記憶體和陣列記憶體.

三.new 和malloc  以及  delete 和free 示例程式碼

//開闢一個三行四列二維陣列,每個元素放一個字nihao符串“hdghjs”;

int main()
{
char ***p = new char **[3];
for (int i = 0;i < 3;i++)
{
p[i] = new char *[4];
for (int j = 0;j < 4;j++)
{
p[i][j] = "hello world";
}
}
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 4;j++)
{
cout <<  " "<< p[i][j] ;
}
cout << endl;
}
for (int i = 0;i < 3;i++)
{
delete[]p[i];
}
delete[]p;
return 0;
}


//開闢一個三行四列二維陣列,
int main()
{
int **p = new int *[3];
for (int i = 0;i < 3;i++)
{
p[i] = new int[4];
}
for (int i = 0;i < 3;i++)
{
delete[]p[i];
}
delete []p;
}


int main()
{
int **p = (int **)malloc(sizeof(int *) * 3);
for (int i = 0;i < 3;i++)
{
p[i] = (int *)malloc(sizeof(int) * 4);
}
for (int i = 0;i < 3;i++)
{
free(p[i]);
}
free(p);


}