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

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

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

  what???這倆貨難道不是一回事嗎???
  不不不其實這倆貨差別大着呢。通過名字來區分指針數組是數組,而數組指針是指針,記憶訣竅就是看名字的最後兩個自。他們兩在定義的時候差不多就是下面這麼個情況。
在這裏插入圖片描述
  爲什麼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;
}

【運行結果】
在這裏插入圖片描述
  如果我們不這樣定義,按照普通數組的定義方法來定義的話可以通過編譯,但是運行的時候就會出錯。這是因爲指針數組裏面的每一個元素存放的都應該的地址。如果我們存儲非地址的值雖然可以通過編譯,但是不能得到我們想要的結果。

/*#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;
} */這是錯誤示範

【運行結果】
實際效果可能會因不同編譯器產生差異
  另外還需要注意的是,我們在使用指針數組存放指向字符串的指針在讀取的時候和指向整形變量略有不同,上面我們在讀取指向整形變量的指針數組的時候輸出是使用的 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;
 } 

【運行結果】
在這裏插入圖片描述

二、數組指針

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

程序一:指針數組程序

#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;
}

【運行結果】
在這裏插入圖片描述
程序二:用指針遍歷數組的程序

#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;
}

【運行結果】
在這裏插入圖片描述
  通過上面的兩個程序我們發現,同樣是讀取數組卻有不同的方法。其實第二種方法只能叫做使用指針遍歷數組,因爲第二個程序的指針其實指向的是數組的第一個元素的地址2,所以我們在讀取的時候是使用的 *(pa+1) 。而第一個程序纔是真正意義上的數組指針。
  如果看完本文有疑問或者好的建議與歡迎在下方留言評論。


  1. 關於C語言運算符的優先級可參考此文運算符的優先級和結合性↩︎

  2. 因爲數組名等於數組的第一個元素的地址等於數組的地址。所以我們在賦值的時候只寫了數組名,但是其實他是指向的數組的第一個元素的地址。 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章