220 likes | 364 Views
資料大樓. --談指標與陣列 200 8.12. 綠園. 指標與陣列. 陣列:是 固定長度 且 連續 的記憶體區塊。 指標:是一種特殊的變數,用來記錄所指向變數的 位址 。 陣列名稱 本身是一個存放位址的 「指標常數」 ,它儲存了 陣列第一個元素的位址。 所以 陣列的元素 就可以利用 指標的運算 來存取。. 指標與一維陣列. 若宣告 int a[3]={5,7,9}; 則指標 a , 所指的是 a[0] 的位址。 即: * a 和 a[0] 的值是一樣的。 *( a+1) 和 a[1] 的值是一樣的。 *( a+2) 和 a[2] 的值是一樣的。.
E N D
資料大樓 --談指標與陣列 2008.12. 綠園
指標與陣列 • 陣列:是固定長度且連續的記憶體區塊。 • 指標:是一種特殊的變數,用來記錄所指向變數的位址。 • 陣列名稱本身是一個存放位址的「指標常數」,它儲存了陣列第一個元素的位址。 • 所以陣列的元素就可以利用指標的運算來存取。
指標與一維陣列 若宣告 int a[3]={5,7,9}; 則指標a,所指的是a[0]的位址。 即: *a和 a[0]的值是一樣的。 *(a+1)和 a[1]的值是一樣的。 *(a+2)和 a[2]的值是一樣的。
指標與一維陣列範例 #include <iostream> #include <cstdlib> using namespace std; int main(void) { int a[3]={5,7,9}; int i,sum=0; for(i=0;i<3;i++) sum += *(a+i); /* 同sum += a[i] */ cout << "sum=" << sum << endl; system("PAUSE"); return 0; }
雙重指標 • 指標不但可以指向任何一種資料型態的變數,還可以讓指標指向另一個指標變數,這種指向指標的指標,稱為雙重指標。
雙重指標的宣告 • 雙重指標變數的宣告: • int**ptri; /*可指向整數的雙重指標*/ • char**ptrc; /*可指向字元的雙重指標*/ • 也可以這樣宣告: • int*(*ptri); /*可指向整數的雙重指標*/ • char*(*ptrc);/*可指向字元的雙重指標*/
雙重指標範例 int a=10, b, *p,**pp; p = &a; //圖解一 pp = &p; b = *p; *p = 20; //圖解二 cout << “a=” << a << “,b=” << b << endl; **pp = 30; //圖解三 cout << “a=” << a << “,b=” << b << endl; cout <<“*p=” << *p <<“,**pp=” << **pp << endl; 執行結果: a=20,b=10 a=30,b=10 *p=30,**pp=30
雙重指標範例圖解一 int a=10, b, *p,**pp; p = &a; pp = &p; b = *p; 10
雙重指標範例圖解二 *p = 20; 10
雙重指標範例圖解三 **pp = 30; 10
8 2 1004 1028 5 1016 1020 6 3 9 1008 1032 4 1024 1000 1 1012 7 二維陣列vs. 雙重指標 int num[3][3]={{1,2,3},{4,5,6},{7,8,9}}; num[3][3]
5 6 4 2 8 3 9 1 7 二維陣列 vs. 雙重指標 指標常數 指標常數陣列 num[0][0]
2 3 1 5 6 4 8 9 7 二維陣列 vs. 雙重指標 num[3][3] num[0][0]的位址 *(num+0)+0 1000 num[0][1]的位址 *(num+0)+1 1004 num[0][2]的位址 ______________ num[1][0]的位址 ______________ num[1][1]的位址 ______________ num[1][2]的位址 ______________ num[2][0]的位址 ______________ num[2][1]的位址 ______________ num[2][2]的位址 ______________
2 3 1 5 6 4 8 9 7 二維陣列 vs. 雙重指標 num[0][0]*(*(num+0)+0) 1 num[0][1]______________ num[0][2]______________ num[1][0]______________ num[1][1]______________ num[1][2]______________ num[2][0]______________ num[2][1]______________ num[2][2]______________ num[3][3]
動態記憶體配置運算子 【new與 delete】 利用 new取得動態空間 int *ptr; ptr = new int; *ptr = 10; 可以合併寫成 int *ptr = new int(10); 利用delete釋放空間 delete ptr; ptr = NULL;
一維動態記憶體配置 int i, n; cin >> n;// 輸入5 // ptr指向 n個連續整數動態空間的首位空間位址 int *ptr = new int[n]; for(i=0; i<n; i++) *(ptr+i)=(i+1)*(i+1); 配置n個int
二維動態配置記憶體 int i, m, n; cin >> m >> n; int **ptr = new int*[m]; for(i=0; i<m; i++) ptr[i] = new int[n];
二維動態配置記憶體 int **ptr = new int*[m]; …… for(i=0; i<m; i++) ptr[i] = new int[n];
釋放記憶體 • 一維動態配置的記憶體釋放 int *ptr = new int[n]; ...... delete[] ptr; ptr = NULL;
釋放記憶體 • 二維動態配置的記憶體釋放 int **ptr = new int*[m]; for(i=0; i<m; i++) ptr[i] = new int[n]; ...... for (i=0; i<m; i++) { delete[] ptr[i]; ptr[i] = NULL; } delete[] ptr; ptr = NULL;
指標與參照 • 指標:可以指向任意的同型態變數。 int i=10, j=20, *ptr; ptr = &i; *ptr = *ptr + 5; ptr = &j; • 參照:取得欲參考變數的位址,直接代替該變數。且一經設 定,就無法改變,必須從一而終。 int i=15, j=30; int &ref; //(X) int &ref = i; //(O) int &ref = j; //(X)
指標、參照與函數 • 函數傳回值為指標與參照之差異: int *func1(int *); int &func2(int &); ...... func1(a) = 100; // (X) func2(a) = 100; // (O) 因此,若是當程式中需要將函數裡的某個變數位址傳回,並為它設值時,指標就無用武之地,只能使用參照完成。