Pointer: 指標()

ª        指標與陣列

陣列:是固定長度的記憶體區塊。

指標:是實是一種特殊的變數,用來記錄所指向變數的位址

陣列的元素排列可以利用指標的運算來存取。

ª        指標與陣列的關係

1.陣列是利用註標取出元素值。

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

ª        二維陣列 vs. 雙重指標

若宣告 int num[3][3];

 

num[3][3]

 

num[0][0]    *(*(num+0)+0)

num[0][1]    ______________

num[0][2]    ______________

num[1][0]    ______________

num[1][1]    ______________

num[1][2]    ______________

num[2][0]    ______________

num[2][1]    ______________

num[2][2]    ______________


ª        【練習一】:

#include <iostream>

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);

   cout << "sum=" << sum << endl;

   return 0;

}

請畫下過程:

i = 0 :

 

 

i = 1 :

 

 

i = 2 :

 

 

最後,sum = ___________

ª         【練習二】:利用指標,將陣列傳入函數。請寫下執行結果(並說明)

#include <iostream>

using namespace std;

void add(int *,int,int,int);

int main(void)

{  int a[10]={1,2,3,4,5,6,7,8,9,10};

   int i,n=3,m=8,k=5;

   cout << " Before process...\n array a=";

   for(i=0; i<10; i++) /* 印出陣列的內容 */

      cout << a[i] << " ";

   add(a,n,m,k);    /* 呼叫自訂函數add() */

   cout << "\n After process...\n array a=";

   for(i=0; i<10; i++) /* 印出陣列的內容 */

      cout << a[i] << " ";

   return 0;

}

 

void add(int *ptr, int n, int m, int k)

{  int i;

   for(i=n; i<=m; i++)

      *(ptr+i) += k;

   return;

}

 

執行結果:

 

 

 

 

 

ª        函數傳回值為指標型態的情況。

練習三:請Trace 結果:

#include <iostream>

using namespace std;

#define SIZE 5

int *maximum(int *);

int main(void)

{

   int a[SIZE]={3,1,7,2,6};

   int i,*ptr;

  

   cout << "array a=";

   for(i=0;i<SIZE;i++)

       cout << a[i] << " ";

   ptr=maximum(a);

   cout << endl;

cout<< "maximum=" << *ptr;

cout << endl;

   return 0;

}

/* 尋找並傳回陣列的最大值 */

int *maximum(int *m)

{

   int i,*max;

 

   max=m;

   for(i=1;i<SIZE;i++)

      if(*max < *(m+i))

         max=m+i;

   return max;

}

 

 

 

 

ª        動態配置記憶體:

一維配置

int *ptr = new int[5];

 

二維配置
int i;
int **ptr = new int*[5];
for (i=0; i<5; i++)
   ptr[i] = new int[3];

 

範例一:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()

{

  int *score;

  int i, num, sum;

  float avg;

 

  sum=0;

  cout << “請輸入學生人數”;

  cin >> num;

  score = new int[num];

  if (!score)

  {

     cout << “Memory allocate fail!! ” << endl;

     exit(1);

  }

 

  for (i=0; i<num; i++)

  {

     cout << “Input  English score.  >>>”;

     cin >> score[i];

     sum += *(score + i);

  }

 

  avg = (float) sum / (float) num;

  cout << “The average is ” << avg << endl;

  delete score;

  score = NULL;

  system(“PAUSE”);

  return 0;

}