1 / 22

資料大樓

資料大樓. --談指標與陣列 200 8.12. 綠園. 指標與陣列. 陣列:是 固定長度 且 連續 的記憶體區塊。 指標:是一種特殊的變數,用來記錄所指向變數的 位址 。 陣列名稱 本身是一個存放位址的 「指標常數」 ,它儲存了 陣列第一個元素的位址。 所以 陣列的元素 就可以利用 指標的運算 來存取。. 指標與一維陣列. 若宣告 int a[3]={5,7,9}; 則指標 a , 所指的是 a[0] 的位址。 即: * a 和 a[0] 的值是一樣的。 *( a+1) 和 a[1] 的值是一樣的。 *( a+2) 和 a[2] 的值是一樣的。.

winka
Download Presentation

資料大樓

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 資料大樓 --談指標與陣列 2008.12. 綠園

  2. 指標與陣列 • 陣列:是固定長度且連續的記憶體區塊。 • 指標:是一種特殊的變數,用來記錄所指向變數的位址。 • 陣列名稱本身是一個存放位址的「指標常數」,它儲存了陣列第一個元素的位址。 • 所以陣列的元素就可以利用指標的運算來存取。

  3. 指標與一維陣列 若宣告 int a[3]={5,7,9}; 則指標a,所指的是a[0]的位址。 即: *a和 a[0]的值是一樣的。 *(a+1)和 a[1]的值是一樣的。 *(a+2)和 a[2]的值是一樣的。

  4. 指標與一維陣列範例 #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; }

  5. 雙重指標 • 指標不但可以指向任何一種資料型態的變數,還可以讓指標指向另一個指標變數,這種指向指標的指標,稱為雙重指標。

  6. 雙重指標的宣告 • 雙重指標變數的宣告: • int**ptri; /*可指向整數的雙重指標*/ • char**ptrc; /*可指向字元的雙重指標*/ • 也可以這樣宣告: • int*(*ptri); /*可指向整數的雙重指標*/ • char*(*ptrc);/*可指向字元的雙重指標*/

  7. 雙重指標範例 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

  8. 雙重指標範例圖解一 int a=10, b, *p,**pp; p = &a; pp = &p; b = *p; 10

  9. 雙重指標範例圖解二 *p = 20; 10

  10. 雙重指標範例圖解三 **pp = 30; 10

  11. 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]

  12. 5 6 4 2 8 3 9 1 7 二維陣列 vs. 雙重指標 指標常數 指標常數陣列 num[0][0]

  13. 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]的位址 ______________

  14. 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]

  15. 動態記憶體配置運算子 【new與 delete】 利用 new取得動態空間 int *ptr; ptr = new int; *ptr = 10; 可以合併寫成 int *ptr = new int(10); 利用delete釋放空間 delete ptr; ptr = NULL;

  16. 一維動態記憶體配置  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

  17. 二維動態配置記憶體  int i, m, n;  cin >> m >> n; int **ptr = new int*[m]; for(i=0; i<m; i++) ptr[i] = new int[n];

  18. 二維動態配置記憶體 int **ptr = new int*[m]; …… for(i=0; i<m; i++)   ptr[i] = new int[n];

  19. 釋放記憶體 • 一維動態配置的記憶體釋放 int *ptr = new int[n]; ...... delete[] ptr; ptr = NULL;

  20. 釋放記憶體 • 二維動態配置的記憶體釋放 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;

  21. 指標與參照 • 指標:可以指向任意的同型態變數。 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)

  22. 指標、參照與函數 • 函數傳回值為指標與參照之差異: int *func1(int *); int &func2(int &); ...... func1(a) = 100; // (X) func2(a) = 100; // (O) 因此,若是當程式中需要將函數裡的某個變數位址傳回,並為它設值時,指標就無用武之地,只能使用參照完成。

More Related