指針和數組的關系


  數組名是一個指針常量,表示數組第一個元素的的起始地址。

 如 int a[5];  a表示數組第一個元素a[0]的起始地址&a[0]。

 

一 引用數組元素的方法

  ①用數組下標引用數組元素

  數組a中元素用下標表示為: 

  a[0] a[1] a[2] a[3] a[4]

  ②用指針引用數組元素

  數組a中元素用下標表示為:

  int *p = a;  

  *p, *(p+1), *(p+2), *(p+3), *(p+4)

二 數組和指針的關系

  ①既然p是指向數組第一個元素起始地址的指針,可以用*(p+i)表示數組中第i+1個元素,a也是指向數組第一個元素的指針啊,那么能不能用*(a+i)表示第i+1個元素呢?

  可以的,可以用printf 打印 *(a+i)的值驗證

  ②反過來,a是指向數組第一個元素起始地址的指針,可以用a加數組下標引用數組元素,如a[3],p也是指向數組第一個元素起始地址的指針,能不能用p加數組下標引用數組元素?

  也是可以的,可以用printf 打印 p[0], p[1]....的值驗證

PS: 由上得,數組名a和指針p是一樣的。實際上編譯時,數組元素a[i] 就是當作 *(a+i)去處理的,先通過數組名a找到數組的首地址,然后首地址 a+i 得到元素a[i]的地址,

  再然后通過*(a+i)得到第i個元素的內容。

  所以:數組的第i個元素直接寫成*(a+i)的形式直接取得值,效率不就提升了嗎。省去編譯器先通過數組名a找到數組的首地址,然后首地址 a+i 得到元素a[i]的地址,

  再然后通過*(a+i)得到第i個元素的內容。

三 指向數組的指針的自增

  int a[5];

  int *p = a; 

  可以 ++p 遞增指針p指向下一個數組元素,然后用*p取得元素的值。

  能不能用a++或者++a把指針指向下一個數組元素? 不能!!! 開頭就說過,數組名是指向數組首元素的指針常量。指針a是不可以指向其他元素的,只能指向首元素的起始地址。

四 數組指針做形參

  把數組從主調函數傳到被調函數時,我們可以傳數組的首地址和數組長度就可以,為什么不是傳遞數組呢?還是為了效率,下面用代碼說明:

  void Output(char *p, int len);

  int main()
  {
    char str[] = "HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld ";
    Output(str, strlen(str));
    system("pause");
    return 0;
  }

  void Output(char *p, int len)
  {
    for (int i = 0; i < len; ++i)
    {
      printf("%c", *(p + i));
    }
  }

如上,如果我們Output函數不是用指針的方式char *p,而是用數組的方式char p[]的話,有什么不一樣?

我們定義的數組str有65字節,調用函數的話會傳遞這65字節的數組。

char *p指針大小是4字節,只需要傳遞4字節的數據就可以了,不止少傳遞數據,執行起來也更快了。

 

PS: 指針大小可以打印sizeof(int*),sizeof(char*)去驗證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM