c程式設計--指標與陣列

weixin_34104341發表於2020-04-07
從K&D 選摘的譯了一段。據已之好。所以與原文相處甚遠。

The C programming Language
Chapter 5 - Pointers and Arrays

要指標,不要陣列。

陣列就是指標:

在C語言裡,陣列和指標有著天然的親密聯絡,以至於不得不能把它們分開來談。任何用陣列可以實現的操作,都可以用指標來實現。指標實現起來更快。
陣列的下標和指標運算非常相似。在定義變數時,陣列型別變數的值就是陣列中地址偏移為0元素的地址。即:
p=&a[0];

因為陣列名等價於陣列首元素的位置,上面的表示式也可以寫成:
p=a;

關於陣列名和指標,有一點區別必須明確:指標是變數,所以p=a或者p++是合法的。陣列名不是變數,所以a=p或a++是非法的。
當用陣列用作為函式引數時,函式傳遞的實際是陣列的首元素的地址。在被呼叫的函式中,引數是本地變數(local variabe),所以,陣列名就是一個指標。也就是說,一個內容為“地址”的變數。據此,我們可以寫一個測試字串長度的函式strlen():
/* strlen:  return length of string s */
   int strlen(char *s)
   {
       int n;

       for (n = 0; *s != '\0', s++)
           n++;
       return n;
   }

由於s是一個指標,對其進行自加(s++)是合法的。s++不會影響呼叫strlen()的函式中的原來的字串,而僅僅改變strlen()的私有指標變數s。這意味著下面的呼叫都是正確的。
   strlen("hello, world");   /* 靜態字串 */
   strlen(array);            /* char型陣列 */
   strlen(ptr);              /* char型指標 */

在定義形參時,
char s[]

char *s;
是等價的。我們更喜歡後者。因為它更明確地指出這是一個指標變數。一個陣列名被傳給一個函式時,函式會按自己的愛好選擇把它當成陣列還是指標,並靈活地處理它。如果不會影響程式碼的清晰表達,也可以兩種方法混用。


地址運算:



指標用做函式引數:

在c語言中,函式引數是按值傳遞的,被呼叫函式沒有辦法直接改變呼叫函式中的變數。例如,一個排序程式想通過呼叫swap引數來改變交換兩個引數。這樣寫是不起作用的:
swap(a,b);
在函式這樣實現時:
   void swap(int x, int y)  /* WRONG */
   {
       int temp;

       temp = x;
       x = y;
       y = temp;
   }


上面的函式複製了變數a和b,並把複製的這兩個變數的值做了交換。

正確的呼叫應該這樣寫:
swap(&a, &b);

這時的函式體應該是下面這樣:
   void swap(int *px, int *py)  /* interchange *px and *py */
   {
       int temp;

       temp = *px;
       *px = *py;
       *py = temp;
   }


指標陣列和指向指標的指標:
指標本身也是變數,他們可以像別的變數一樣被儲存為陣列。

轉載於:https://www.cnblogs.com/diylab/archive/2007/07/26/832658.html

相關文章