數組的指針即整個數組在內存中的起始地址,而數組元素的指針是數組中某一元素所占存儲單元的地址。
利用指針法引用數組元素能使目標程序質量高、占內存少、運行速度快。
C++語言中規定:數組名就代表數組首地址,也就是數組第0號元素的地址。如
int a[10];
int *p;
p=&a[0];/*與p=a,是等價的*/
p+i或a+i就是a[i]元素的存儲地址,即它們都指向數組的第i號元素a[i]。所以*(p+i)或*(a+i)就與a[i]是等價的。實際上,在編譯時,編譯程序把a[i]處理成*(a+i)。因此利用此方法就可訪問到數組元素。如:
main()
{
int a[10];
int *p, i;
for(i=0;i<10;i++)
cin>>a[i];
p=a;
for(i=0;i<10;i++)
cout<<*(p+1);//等價於cout<<a[i];
}
說明:
(1)p++是指向數組元素的下一個元素。
(2)*p++的運算,由於*和++運算級是相同的,且結合特性為自右向左,所以,*p++等同於*(p++),它的作用是先得到p所指向的元素的值(即*p),然後再是p+1。
(3)*(p++)和*(++p)的作用是不同的。
*(p++)是先取p做*運算,然後再使p加1(即指向下一個運算);比如在數組中p指向了第三個元素,那麼就先把第三個元素的值取出來(做*運算),然後再把p指向下一個元素。
*(++p)是先使p加1(即使p指向下一個元素),然後再做*運算。比如在數組中p指向了第三個元素,那麼就先把p指向第四個元素,然後再把第四個元素的值取出來(做*運算)。
(4)(*p)++表示p所指的元素值加1,對上例來說等同於a[0]++。
(5)對於指針的--(自減)運算原理同上。
(6)只有指向數組元素的指針變量才可以進行自加或自減運算。
數組名作函數參數
利用數組名作為函數的參數可以用以下4種方法實現:
(1)形參和實參都用數組名
(2)實參用數組名而形參用指針變量
(3)實參和形參都用指針變量
(4)實參用指針變量,而形參用數組名
指針數組和指向指針的指針
1、指針數組
char* name[3] = {"fortran", "basic", "pascal"};
2、指向指針的指針
char **p;
**p相當於*(*p),說明指針變量p是指向一個字符型指針變量(指向字符型數據的指針變量)的。