指標與陣列概念、指標陣列、陣列指標詳解
阿新 • • 發佈:2018-12-30
指標與陣列
指標可以與變數結合,也可以與陣列結合使用。指標陣列和陣列指標是兩個截然不同的概念,指標陣列是一種陣列,該陣列存放的是一組變數的地址。陣列指標是一個指標,表示該指標是指向陣列的指標。
1.指向陣列元素的指標
int a[5]={1,2,3,4,5};
int *p=a; //int *p=&a[0];
如上程式碼,指標變數p指向了a陣列的首元素,其方法可有兩種,int *p=a或int *p=&a[0];
注意:指標變數的型別應與指標所指向的變數的型別一致,如下程式碼會報錯
/* int *p; float x=3.14; 指標變數的型別應和所指向的變數型別一致。 p=&x; 否則會報錯 */
與整型、浮點型資料一樣,指標也可以進行算術運算,但含義卻不同。當一個指標加一或減一併不是使指標增加1或減少一,而是使指標所指向的位置向後或向前移動了一個位置。例如執行a=a+3,如果一個整型佔用4個位元組,則相加後a=2000+4*3=2012(這裡假設指標a的初值為2000)。同樣指標也可進行自加自減運算。
也可以用一個指標變數減去另一個指標變數,具體看如下程式碼和結果:
int *p,*q,b; int shuzu[6]={0,1,2,3,4,5}; p=shuzu,q=&shuzu[3]; printf("p和q兩指標的地址分別為:%d %d",&p,&q); printf("\np和q兩指標的值為(即所指向元素的地址為):%d %d",p,q); b=p-q; printf("\nb的值為:%d ",b); //b=兩指標值相減的差除以4
結果為:
2.指標陣列
指標陣列其實也是一個數組,只是陣列中的元素是指標型別的資料。換句話說,指標陣列中的每一個元素都是一個指標變數。
定義指標陣列的方式如下:
int *p[4];
由於[ ]運算子優先順序比*高,p優先與[ ]結合,從而形成一個數組,然後再與*結合,表示該陣列是指標型別的,每個陣列元素是一個指向整型的變數 。
指標陣列常常用於儲存一些長度不等的字串資料,有的讀者可能會問,為什麼不存放在二維陣列中?因為如將這些字串若放在二維陣列中,就需要定義一個能容納最長字串的陣列長度,這樣就會浪費一些空間。下面看我的程式碼,上面有註釋。
#include<stdio.h> int main() { /*二維陣列方式存放長度不一的字串 */ int i,n=2; char shuzu[2][9]={"my love","my hobby"}; //9為最小長度,不然報錯,陣列[1]別忘了末尾有個'\0', //所以長度為8+1=9 printf("%s\n",shuzu); puts(shuzu[1]); //puts(shuzu)會報錯 /* 指標陣列存放長度不一的字串*/ char *s[2]={"my love","my hobby"}; for(i=0;i<2;i++) printf("第%d個元素為:%s\n",i,s[i]); char *p; // for(p=s[0];p<s[0]+2;p++) // printf("%s",p); /*p自加後並不是往後移了一個單位*/ p=s[0]; printf("%s\n",p); p++; printf("%s\n\n",p); /*正確方式1*/ printf("\n通過指向陣列的指標輸出字串:\n"); for(p=s[0],i=0;i<n;p=s[i]) { printf("第%d個字串:%s\n",i+1,p); i++; } /*正確方式二*/ printf("\n用陣列名輸出指標陣列:\n"); for(i=0;i<2;i++) printf("%s\n",s[i]); }
執行結果:
...........