指標變數既可指向變數,又可指向陣列元素(把陣列某一元素的地址存放在指標變數),它們都有地址。陣列元素的指標就是陣列元素的地址。
可以由兩種辦法引用陣列元素。
1.下標法,如a【1】;
2.指標法,如p=&a【0】(p為指標變數)等價於p=a。
在用指標變數引用陣列有幾個很重要的知識點。
1.假設a為陣列名,當指標引用時相當於a【0】,將a首元素地址賦值給p(p=a);
2.p=&a【0】,int p=a(將a首元素地址賦值給p),int p=&a【0】完全等價。
3.在scanf函式中&可以不寫如scanf(“%d”,p)或scanf(“%d”,a)前提是p和a都為指標變數。a可為陣列名。但這樣做相當與把輸入的值直接存放到a或p中
4.對於按一定順序輸出陣列元素所用for迴圈不再用
而可以將定義一個指標變數p使p++代替a【i】,這樣的執行效率也高。由這個例子引出知識點5.
(1)p++==a【i】(i++);
(2)p--同上型別;
(3)p++==(p+1)(由於++與同優先順序,結合方向自左向右,先引出p的值,實現p,再使p
自增)。引出下面一個知識點。
(4)當出現陣列a【0】++這樣的相當與a【0】的值加一等價於(p)++。
5.當指標變數已指向一個陣列元素時,p+1,p-1代表指標的移動,分別指向上一個元素和下一個元素。
兩個指標相減,如p1-p2(都指向同一個陣列),代表所指元素的距離,具體計算(地址相減再除去指標變數型別的位元組長),但p1+p2毫無實際意義。
如果p的初值為a【0】,那麼p+i和a+i都代表a【i】的地址。(p+i)和*(a+i)代表a【i】所指向的元素。
一個小tip:a【i】為陣列名但實際上其實是地址,由直接訪問(變數名加型別名、大小搜尋),也就相當於地址。
6.可以有p【i】形式,但關鍵是看p所代表的是a陣列中哪一號元素,若為【0】則p【i】相當於a【i】,若為【n】則為a【n+i】。
7.不能有a++的形式,因為a是一個常量代表陣列首個元素的地址相當於a【0】;
8.函式可透過形參的改變改變實參也就是陣列值。
知識點先這麼多,有的話接下來補充。
例題輔助消化一下:
`#include<stdio.h>
int main()
{
int p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
for(i=0;i<10;i++,p++)
printf("%d\n",p);
return 0;
}`
輸出結果
實際上這是因為在scanf中p++並非只是臨時值,而是切實改變了,同理作為條件表示式時也是如此。容易栽坑。
只需要把p=a放scanf後即可。