引用及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++中動態記憶體的分配
New和malloc有什麼區別?
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 的底層呼叫的還是
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);
}