1. 程式人生 > >指標與陣列概念、指標陣列、陣列指標詳解

指標與陣列概念、指標陣列、陣列指標詳解

指標與陣列

指標可以與變數結合,也可以與陣列結合使用。指標陣列和陣列指標是兩個截然不同的概念,指標陣列是一種陣列,該陣列存放的是一組變數的地址。陣列指標是一個指標,表示該指標是指向陣列的指標。

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]);             
} 

執行結果:

...........