通過指針引用數組元素

  • 2017-09-12
  • 83

西安網站建設 通過指針引用數組元素

C語言規定:如果指針變量p已指向數組中的一個元素,則p+1指向同一數組中的下一個元素。

引入指針變量後,就可以用兩種方法來訪問數組元素了。

如果p的初值為&a[0],則:

p+i和a+i就是a[i]的地址,或者說它們指向a數組的第i個元素。

 

*(p+i)或*(a+i)就是p+i或a+i所指向的數組元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。

指向數組的指針變量也可以帶下標,如p[i]與*(p+i)等價。

根據以上敘述,引用一個數組元素可以用:

下標法,即用a[i]形式訪問數組元素。在前麵介紹數組時都是采用這種方法。

指針法,即采用*(a+i)或*(p+i)形式,用間接訪問的方法來訪問數組元素,其中a是數組名,p是指向數組的指針變量,其處值p=a。

【例10.9】輸出數組中的全部元素。(下標法)

main(){

  int a[10],i;

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

    a[i]=i;

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

    printf("a[%d]=%d\n",i,a[i]);

}

【例10.10】輸出數組中的全部元素。(通過數組名計算元素的地址,找出元素的值)

main(){

  int a[10],i;

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

    *(a+i)=i;

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

    printf("a[%d]=%d\n",i,*(a+i));

}

【例10.11】輸出數組中的全部元素。(用指針變量指向元素)

main(){

  int a[10],I,*p;

  p=a;

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

    *(p+i)=i;

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

    printf("a[%d]=%d\n",i,*(p+i));

}

【例10.12】

main(){

  int a[10],i,*p=a;

  for(i=0;i<10;){

    *p=i;

    printf("a[%d]=%d\n",i++,*p++);

  }

}

幾個注意的問題:

指針變量可以實現本身的值的改變。如p++是合法的;而a++是錯誤的。因為a是數組名,它是數組的首地址,是常量。

要注意指針變量的當前值。請看下麵的程序。

【例10.13】找出錯誤。

main(){

  int *p,i,a[10];

  p=a;

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

    *p++=i;

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

    printf("a[%d]=%d\n",i,*p++);

}

【例10.14】改正。

main(){

  int *p,i,a[10];

  p=a;

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

*p++=i;

  p=a;

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

    printf("a[%d]=%d\n",i,*p++);

}

從上例可以看出,雖然定義數組時指定它包含10個元素,但指針變量可以指到數組以後的內存單元,係統並不認為非法。

*p++,由於++和*同優先級,結合方向自右而左,等價於*(p++)。

*(p++)與*(++p)作用不同。若p的初值為a,則*(p++)等價a[0],*(++p)等價a[1]。

(*p)++表示p所指向的元素值加1。

如果p當前指向a數組中的第i個元素,則

*(p--)相當於a[i--];

*(++p)相當於a[++i];

*(--p)相當於a[--i]。

西安網站建設

通過指針引用數組元素——西安做網站-www.xgktgj.com