Dynamic Memory Allocation
洪翠憶
以下內容為複習&附錄
Array with Pointer
declare a pointer to an array
宣告指標陣列
int *p[10];
int (*q)[10];
*𝐩[10] vs (*𝐩)[10]
#include <iostream>
int main(){
int *p[5];
int (*q)[5];
int r[5] = {2, 4, 6, 8, 10};
std::cout << sizeof(p) << ' ' << sizeof(q) << ' ' << sizeof(r) << "\n\n";
//---------------------------
for(int i=0;i<5;i++){
std::cout << p[i] << ' ';
}
std::cout << '\n';
for(int i=0;i<5;i++){
std::cout << q[i] << ' ';
}
std::cout << '\n';
for(int i=0;i<5;i++){
std::cout << &r[i] << ' ';
}
std::cout << "\n\n";
//---------------------------
for(int i=0;i<5;i++)
p[i] = r+i;
q = &r;
for(int i=0;i<5;i++){
std::cout << *p[i] << ' ';
}
std::cout << '\n';
for(int i=0;i<5;i++){
std::cout << (*q)[i] << ' ';
}
std::cout << '\n';
for(int i=0;i<5;i++){
std::cout << r[i] << ' ';
}
std::cout << "\n\n";
return 0;
}
現在來試著宣告看看指標陣列吧!
(5 min)
2D Array with Pointer
Assign a 2D array by Using Pointer
建立二維指標陣列
int *p[大小][大小];
int (*q)[大小][大小];
Example
#include <iostream>
int main(){
int arr[3][4] = {
3, 6, 2, 7,
3, 6, 4, 5,
2, 6, 8, 9
};
int *p[3][4];
int (*q)[3][4] = &arr;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
p[i][j] = &arr[i][j];
std::cout << *p[0][0] << ' ' << *p[0][1] << ' ' << *p[0][2] << ' ' << *p[0][3] << '\n';
std::cout << *p[1][0] << ' ' << *p[1][1] << ' ' << *p[1][2] << ' ' << *p[1][3] << '\n';
std::cout << *p[2][0] << ' ' << *p[2][1] << ' ' << *p[2][2] << ' ' << *p[2][3] << "\n\n";
std::cout << (*q)[0][0] << ' ' << (*q)[0][1] << ' ' << (*q)[0][2] << ' ' << (*q)[0][3] << '\n';
std::cout << (*q)[1][0] << ' ' << (*q)[1][1] << ' ' << (*q)[1][2] << ' ' << (*q)[1][3] << '\n';
std::cout << (*q)[2][0] << ' ' << (*q)[2][1] << ' ' << (*q)[2][2] << ' ' << (*q)[2][3] << '\n';
return 0;
}
接下來的內容:
Allocate a 2D array Dynamically
建立動態二維陣列
//建立
int **指標變數 = new int*[縱軸大小];
for(int i=0;i<縱軸大小;i++)
指標變數[i] = new int[橫軸大小];
//刪除
for(int i=0;i<縱軸大小;i++)
delete [] 指標變數[i];
delete [] 指標變數;
看不懂嗎?沒關係我也是
Example
#include <iostream>
int main(){
//p[3][4]
int **p = new int*[3];
for(int i=0;i<3;i++)
p[i] = new int[4];
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
p[i][j] = i * 4 + j;
std::cout << p[0][0] << ' ' << p[0][1] << ' ' << p[0][2] << ' ' << p[0][3] << '\n';
std::cout << p[1][0] << ' ' << p[1][1] << ' ' << p[1][2] << ' ' << p[1][3] << '\n';
std::cout << p[2][0] << ' ' << p[2][1] << ' ' << p[2][2] << ' ' << p[2][3] << '\n';
for(int i=0;i<3;i++)
delete [] p[i];
delete [] p;
return 0;
}
/*
0 1 2 3
4 5 6 7
8 9 10 11
*/
試著用上述方法建立二維陣列吧!
(到16:00)
務必要記得delete喔
二維動態配置陣列聽得懂的話真的很電ヽ(°〇°)ノ
Introduction of DYNAMIC MEMORY ALLOCATION
其實這頁講得差不多了www
-
C++:𝐧𝐞𝐰/𝐝𝐞𝐥𝐞𝐭𝐞
-
C:𝐦𝐚𝐥𝐥𝐨𝐜/𝐟𝐫𝐞𝐞
-
配置失敗時會回傳NULL
if(指標變數 == NULL)
return -1;
→可以這樣檢查記憶體是否配置成功
*指標變數 = 值;
直接對著指標變數用取值符號(*)就能給值了。取值的時候也是用*就能取了→
new / delete
Syntax
new語法
int *p = new int(10);
delete p;
型態
指標名稱
型態 *指標名稱 = 𝐧𝐞𝐰 型態(初始值);
(初始值)
前後要一致
非必填
型態
Syntax
delete語法
int *p = new int(10);
delete p;
𝐝𝐞𝐥𝐞𝐭𝐞 指標變數;
指標變數
一定要記得delete自己動態配置的記憶體!!!!!
Example
例子
#include <iostream>
int main(){
int *p = new int;
*p = 50;
std::cout << *p;
delete p;
return 0;
}
//50
Syntax
動態記憶體配置陣列
int *p = new int[3];
delete [] p;
不能宣告同時賦值了
型態 *指標名稱 = 𝐧𝐞𝐰 型態[格數];
𝐝𝐞𝐥𝐞𝐭𝐞 [] 指標變數;
Example
例子
#include <iostream>
int main(){
char *sky = new char[10];
char *ground = new char[12];
for(int i=0;i<12;i++){
if(i < 10)
sky[i] = i + 97;
ground[i] = i + 65;
}
int *year = new int;
std::cin >> *year;
std::cout << sky[(*year - 4) % 10] << ground[(*year - 4) % 12];
delete year;
delete [] sky;
delete [] ground;
return 0;
}
現在來試著實作動態記憶體分配吧!
(10 min)
務必要記得delete喔
可以先練習建立一個動態變數,順手了之後再挑戰動態陣列
malloc / free
Syntax
malloc語法
int *p = (int*)malloc(sizeof(int));
free(p);
型態
指標名稱
型態 *指標名稱 = (型態*)𝐦𝐚𝐥𝐥𝐨𝐜(記憶體空間大小);
記憶體空間大小
型態
Syntax
free語法
𝐟𝐫𝐞𝐞(指標變數);
指標變數
一定要記得free自己動態配置的記憶體!!!!!
被發現了
學長都偷懶,用複製貼上的D:
int *p = (int*)malloc(sizeof(int));
free(p);
Syntax
realloc語法
int *q = (int*)realloc(p, sizeof(int) * 2);
型態 *新指標 =
(型態*)𝐫𝐞𝐚𝐥𝐥𝐨𝐜(舊指標, 新記憶體空間大小);
-
將新的指標配置於舊的上面
-
起始位置與值不變
雖然C++的new沒有這個語法,但它能輕易達成
Syntax
calloc語法
int *p = (int*)calloc(1, sizeof(int));
型態 *指標名稱 =
(型態*)𝐜𝐚𝐥𝐥𝐨𝐜(陣列格數, 每格的記憶體空間大小);
-
將每格初始化為0
-
與𝐦𝐚𝐥𝐥𝐨𝐜的差別是有無給定初始值0
Example
例子
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p = (int*)malloc(sizeof(int));
printf("%d\n", sizeof(p));
int *o = (int*)calloc(1, sizeof(int));
printf("%d %d\n", *p, *o);
*p = 9;
printf("%d\n", *p);
int *q = (int*)realloc(p, sizeof(int) * 2);
printf("%d\n", *q);
free(q);
free(o);
return 0;
}
/*
4
2035312 0
9
9
*/
Kahoot!
Reference
https://overiq.com/c-programming-101/pointers-and-2-d-arrays/
https://blog.csdn.net/u014605728/article/details/49365847
http://hungming.ct.ntust.edu.tw/2020spring/ct3407/classnotes/ct3407_13.pdf
https://slides.com/alice111359173157/deck/fullscreen#/0/3
https://slides.com/alice111359173157/deck-ade467/fullscreen#/1/1
https://mropengate.blogspot.com/2015/12/cc-dynamic-2d-arrays-in-c.html
Dynamic Memory Allocation
By justhentai
Dynamic Memory Allocation
- 464