天天看點

C語言指針數組VS數組指針

  指針數組和數組指針困惑着許多的C語言初學者,我也一樣,經常會将二者混淆。本文将用盡可能簡單的方式介紹清楚二者的異同。

C語言指針數組VS數組指針

    • 一、指針數組
    • 二、數組指針

  what???這倆貨難道不是一回事嗎???

  不不不其實這倆貨差别大着呢。通過名字來區分指針數組是數組,而數組指針是指針,記憶訣竅就是看名字的最後兩個自。他們兩在定義的時候差不多就是下面這麼個情況。

C語言指針數組VS數組指針

  為什麼int *pa[5]是指針數組而int (*pb)[5]又是數組指針呢?這個是根據C語言的運算符的優先級來決定的1。因為下标運算符優先于取值運算符是以 int *pa[5]是一個數組,又因為當9()和[]同時出現是按從左到右依次運算,是以 int (*pb)[5] 是一個指針,然後再是存放在數組中。

一、指針數組

  指針數組是一個數組,不過這個數組和别的數組有一些不同的是這個數組裡面的每一個元素都是指針的數組。同時還需要注意的是指針數組裡面的每一個元素的變量類型都和指針的類型一緻,也就是說整形的指針數組裡面的每一個元素都是整形指針。指針數組的定義方式如下:

#include <stdio.h>
int main()
{
	int a = 1,b = 2,c = 3,d = 4;
	int *e[]={&a,&b,&c,&d};
	int i;
	for(i=0;i<4;i++)
	{
		printf("%d",*e[i]);
	}
	return 0;
}
           

【運作結果】

C語言指針數組VS數組指針

  如果我們不這樣定義,按照普通數組的定義方法來定義的話可以通過編譯,但是運作的時候就會出錯。這是因為指針數組裡面的每一個元素存放的都應該的位址。如果我們存儲非位址的值雖然可以通過編譯,但是不能得到我們想要的結果。

/*#include <stdio.h>
int main()
{
	int *e[]={1,2,3,4};
	int i;
	for(i=0;i<4;i++)
	{
		printf("%d",*e[i]);
	}
	return 0;
} */這是錯誤示範
           

【運作結果】

C語言指針數組VS數組指針

  另外還需要注意的是,我們在使用指針數組存放指向字元串的指針在讀取的時候和指向整形變量略有不同,上面我們在讀取指向整形變量的指針數組的時候輸出是使用的 printf("%d",*e[i]); 而我們在讀取指向字元串的位址的指針數組的時候不能這樣,因為我們需要讀出整個字元串是以不需要再在指針數組前面加上取值運算符。詳情見下面是指向字元串的指針數組的示例。

#include <stdio.h>
int main()
{
	char *pa[2]=
	{
		"hello,world!",
		"hello,c!",
	};
	int i;
	for(i=0;i<2;i++)
	{
		printf("%s\n",pa[i]);
	}
	return 0;
 } 
           

【運作結果】

C語言指針數組VS數組指針

二、數組指針

  通過前面的介紹我們已經知道了數組指針是一個指針,這個指針是一個指向數組的指針。.既然提到了數組指針是一個指向數組的指針數組的指針,可能有的小夥伴就要說了這個不是在前面學習指針的時候就學了嘛,其實這兩者是不一樣的。兩者的程式都列在了下面,具體的我們可以來比對一下進行講解。

程式一:指針數組程式

#include <stdio.h>
int main()
{
	int temp[]={1,2,3,4,5};
	int (*pt)[5]=&temp;
	int i;
	for(i=0;i<5;i++)
	{
		printf("%d\t",*(*pt+i));
	}
	return 0;
}
           

【運作結果】

C語言指針數組VS數組指針

程式二:用指針周遊數組的程式

#include <stdio.h>
int main()
{
	int a[]={1,2,3,4,5};
	int *pa=a;
	int i;
	for(i=0;i<5;i++)
	{
		printf("%d\t",*(pa+i));
	}
	return 0;
}
           

【運作結果】

C語言指針數組VS數組指針

  通過上面的兩個程式我們發現,同樣是讀取數組卻有不同的方法。其實第二種方法隻能叫做使用指針周遊數組,因為第二個程式的指針其實指向的是數組的第一個元素的位址2,是以我們在讀取的時候是使用的 *(pa+1) 。而第一個程式才是真正意義上的數組指針。

  如果看完本文有疑問或者好的建議與歡迎在下方留言評論。

  1. 關于C語言運算符的優先級可參考此文運算符的優先級和結合性。 ↩︎
  2. 因為數組名等于數組的第一個元素的位址等于數組的位址。是以我們在指派的時候隻寫了數組名,但是其實他是指向的數組的第一個元素的位址。 ↩︎

繼續閱讀