動態分配內存
- 1. 動態分配內存
- 1.1使用new分配內存
- 1.2使用delete釋放內存
- 1.3使用new創建動態分配的數組
- 2. 程序的內存分配
- 3.數組與指針案例實踐
- 4.二維數組與指針
《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------
1. 動態分配內存
1.1使用new分配內存
指針真正的用處在于:在運行階段分配未命名的內存以存儲值(在這種情況下只能通過指針來訪問內存)
1.2使用delete釋放內存
不要釋放已經釋放變量的內存
也不要釋放一般變量的內存
新版本時,對空指針delete是安全的
int *ptr = new int; // ptr-棧區,int 在堆區分配了一塊int型的空間
ptr ++; // 這個操作很危險,使得上面的Int的型空間沒人管了,內存泄漏
delete ptr;
編譯時:編譯的時候就確定下來的空間 int nums[56];
運行時:運行的時候才會確定下來的空間 int *nums = new int[56];
注意不要定義兩個指向同一塊內存空間的指針,避免刪除兩次同一塊地址空間。
1.3使用new創建動態分配的數組
int *intArray = new int[10]; // new 返回第一個元素的地址
delete [] intArray;
2. 程序的內存分配
棧區(stack):先進后出,表面速度非常快
由編譯器自動分配釋放,一般存放函數的參數,局部變量的值。操作方式類似于數據結構中的棧。
堆區(heap)–實際的實現是堆區在做
一般由程序員分配釋放,若不釋放,程序結束時可能由操作系統回收。于數據結構中的堆是兩回事,分配方式有點像鏈表。
全局區(靜態區-static)
全局變量和靜態變量是存放在一起的,程序結束后由系統釋放
文字常量區–常量字符串放在這里,程序結束時由系統釋放
程序代碼區–存放函數體的二進制代碼
int num2 = 0; // 全局變量初始化
int *ptr; // 全局未初始化區
int main(){int num2; // 棧區char str[] = "lalala"; // 棧區char *ptr2 // 棧區char *ptr3 = "lalalala" // ptr3 棧區, lalala\0常量區static int num3 = 1024; // 全局靜態初始化ptr1 = new int[10]; // 分配的內存堆區, ptr1,ptr2 本身在棧區ptr2 = new char[20]; // 分配的內存堆區return 0;
}
3.數組與指針案例實踐
demo1: 一般不要移動指針,移動指針很危險
int main(){int arrays[] = {15, 23, 30, 40, 50};int *ptr_arrays = arrays; //數組名存放數組首地址,所以不需要再取地址符號for(int i = 0; i < 5; i++){cout << *ptr_arrays++ << endl;//推薦 cout << *(ptr_array+i) << endl;}for(int i = 0; i < 5; i++){cout << *ptr_arrays++ << endl;}return 0;
}
輸出
15
23
30
40
50
32766
1616969936
469956749
-472074792
32766
demo2: 指針實現數組元素的逆序
int main(){int arrays[] = {15, 23, 30, 40, 50, 60};int *ptr_start = arrays;int *ptr_end = arrays + 5;int tmp;while(ptr_start < ptr_end){tmp = *ptr_start;*ptr_start = *ptr_end;*ptr_end = tmp;ptr_start++;ptr_end--;}for(int i = 0; i < 6; i++){cout << arrays[i] << '\t';}return 0;
}
輸出
60 50 40 30 23 15
4.二維數組與指針
首地址:
&a[0][0]
使用指針訪問二維數組中的元素
*(a[1] + 2)
*(*(a+1))
使用指針創建二維數組
int *p = new int[10];
int main(){int (*p2)[3] = new int[5][3]; // 將第一維度定位為指針向量p2[3][2] = 2021;for(int i = 0; i < 5; i++){for(int j = 0; j < 3; j++){// cout << p2[i][j] << ',' ;cout << *(*(p2+i)+j) << ',';}cout << endl;}// 二維數組指針就是存放數組第一維度元素地址的向量int arrays[5][3] ={{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6}};int (*p3)[3] = arrays;cout << &arrays[1][0] << endl;for(int i = 0; i < 5; i++){cout << p3 + i << endl;}return 0;
}
0,0,0,
0,0,0,
0,0,0,
0,0,2021,
0,0,0,
0x7ffee5d5857c
0x7ffee5d58570
0x7ffee5d5857c
0x7ffee5d58588
0x7ffee5d58594
0x7ffee5d585a0