[cpp] return address example
在C++中傳遞陣列或傳回陣列一律使用傳遞記憶體位址的方法,因為陣列名稱本身就是個 指標,儲存有位址資訊。
|
|
#include <iostream>
using namespace std;
int* createArray(int);
void deleteArray(int*);
int main() {
int m = 10;
int *arr = createArray(m);
for(int i = 0; i < m; i++) {
arr[i] = i;
}
for(int i = 0; i < m; i++) {
cout << "arr[" << i << "] = " << arr[i] << endl;
}
cout << arr << endl;
cout << arr[3] << endl;
deleteArray(arr);
cout << arr << endl;
cout << arr[3] << endl;
return 0;
}
// 傳回建立的陣列位址
int* createArray(int m) {
int *a = new int[m]; // 動態配置方式
cout << "new a[" << m << "]" << endl;
for(int i = 0; i < m; i++) {
a[i] = 0;
cout << "a[" << i << "] = " << a[i] << endl;
}
cout << a << endl;
return a; // 傳回建立的陣列位址
}
void deleteArray(int* arr) {
delete [] arr;
}
|
Output:
|
|
new a[10] ---> new "array a" and initial
a[0] = 0 ---> assign initial value
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
0x8051438 ---> cout "array a" address
arr[0] = 0 ---> assign value
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
arr[5] = 5
arr[6] = 6
arr[7] = 7
arr[8] = 8
arr[9] = 9
0x8051438 ---> 尚未 delete "array arr"
3 ---> 尚未 delete "array arr"
0x8051438 ---> 已經 delete "array arr"
-1785358955 ---> 已經 delete "array arr"
|
|
由於您使用動態配置的方式,所以在使用delete之前,這塊被配置的記憶體並不會自動清除,所以您可以直接傳回 給呼叫函式的主函式,注意如果您不是使用 new來配置,則在副函式中所宣告的變數記憶體,在副函式執行結束後都會自動消失,則您傳回指標值也就沒有意義,也會造成存取錯誤,因為該塊記憶體在副函式 執行完畢後已經自動回收了。
Ref :
http://caterpillar.onlyfun.net/Gossip/CppGossip/returnBy.html
沒有留言:
張貼留言