【C++】數組指針和指針數組的辨析

在學習C語言的時候,數組和指針沒有那麼多的聯繫,但是當學習到c++的時候,指針和數組常常結合起來,於是就有了指針數組和數組指針這倆我傻傻分不清的概念~

在今天,我把它們分清楚了。如果你也有一樣的困惑,往下看~

首先,理解一下數組指針和指針數組這兩個名詞:

“數組指針”和“指針數組”,只要在名詞中間加上“的”字,就知道中心了——

數組的指針:是一個指針,什麼樣的指針呢?指向數組的指針。

指針的數組:是一個數組,什麼樣的數組呢?裝着指針的數組。

然後,需要明確一個優先級順序:()>[]>*,所以:

(*p)[n]:根據優先級,先看括號內,則p是一個指針,這個指針指向一個一維數組,數組長度爲n,這是“數組的指針”,即數組指針;

*p[n]:根據優先級,先看[],則p是一個數組,再結合*,這個數組的元素是指針類型,共n個元素,這是“指針的數組”,即指針數組。

根據上面兩個分析,可以看出,p是什麼,則詞組的中心詞就是什麼,即數組“指針”和指針“數組”。

 

數組指針 (*p)[n]

數組指針:是指針——指向數組的指針。

看下面的例子進行理解:

int main()
{
	//一維數組
	int a[5] = { 1, 2, 3, 4, 5 };
	//步長爲5的數組指針,即數組裏有5個元素
	int (*p)[5];
	//把數組a的地址賦給p,則p爲數組a的地址,則*p表示數組a本身
	p = &a;
 
	//%p輸出地址, %d輸出十進制
	//\n回車
	//在C中,在幾乎所有使用數組的表達式中,數組名的值是個指針常量,也就是數組第一個元素的地址,它的類型取決於數組元素的類型。
	printf("%p\n", a); //輸出數組名,一般用數組的首元素地址來標識一個數組,則輸出數組首元素地址
	printf("%p\n", p); //根據上面,p爲數組a的地址,輸出數組a的地址
	printf("%p\n", *p); //*p表示數組a本身,一般用數組的首元素地址來標識一個數組
	printf("%p\n", &a[0]); //a[0]的地址
	printf("%p\n", &a[1]); //a[1]的地址
	printf("%p\n", p[0]); //數組首元素的地址
	printf("%d\n", **p); //*p爲數組a本身,即爲數組a首元素地址,則*(*p)爲值,當*p爲數組首元素地址時,**p表示首元素的值1
	printf("%d\n", *p[0]); //根據優先級,p[0] 表示首元素地址,則*p[0]表示首元素本身,即首元素的值1
	printf("%d\n", *p[1]); //爲一個絕對值很大的負數,不表示a[1]...表示什麼我還不知道
 
	
 
	//將二維數組賦給指針
	int b[3][4];
	int(*pp)[4]; //定義一個數組指針,指向含4個元素的一維數組
	pp = b; //將該二維數組的首地址賦給pp,也就是b[0]或&b[0],二維數組中pp=b和pp=&b[0]是等價的
	pp++; //pp=pp+1,該語句執行過後pp的指向從行b[0][]變爲了行b[1][],pp=&b[1]
 
	int k;
	scanf_s("%d", &k);
 
    return 0;
}

根據上面二維數組可以得出,數組指針也稱指向一維數組的指針,所以數組指針也稱行指針。

 

指針數組 *p[n]

指針數組:是數組——裝着指針的數組。

看下面的例子進行理解:

 

int main()
{
	int a = 1;
	int b = 2;
	int *p[2];
	p[0] = &a;
	p[1] = &b;
 
	printf("%p\n", p[0]); //a的地址
	printf("%p\n", &a); //a的地址
	printf("%p\n", p[1]); //b的地址
	printf("%p\n", &b); //b的地址
	printf("%d\n", *p[0]); //p[0]表示a的地址,則*p[0]表示a的值
	printf("%d\n", *p[1]); //p[1]表示b的地址,則*p[1]表示b的值
 
 
	//將二維數組賦給指針數組
	int *pp[3]; //一個一維數組內存放着三個指針變量,分別是p[0]、p[1]、p[2],所以要分別賦值
	int c[3][4];
	for (int i = 0; i<3; i++)
		pp[i] = c[i];
 
	int k;
	scanf_s("%d", &k);
 
    return 0;
}

最後,從上文來看:

數組指針是一個指針變量,佔有內存中一個指針的存儲空間;

指針數組是多個指針變量,以數組的形式存儲在內存中,佔有多個指針的存儲空間。

指向二維數組,取值:

int main()
{
	/*同時指向二維數組時,引用、用數組名引用表達是相同的
	定義一個2行3列的二維整型數組
	0 1 2
	3 4 5
	輸出第1行第2列的值:5*/
 
	int a[2][3] = { {0, 1, 2}, {3, 4, 5} }; //2行3列的二維整型數組
	int(*p)[3]; //數組指針,指向含有3個元素的一維數組
	int *q[2]; //指針數組,一個數組內存放2個指針變量
 
	p = a;
	q[0] = a[0];
	q[1] = a[1];
 
	//輸出第1行第2列的值
	printf("%d\n", a[1][2]); //5
 
	printf("%d\n", *(p[1] + 2)); //5
	printf("%d\n", *(*(p + 1) + 2)); //5
	printf("%d\n", (*(p + 1))[2]); //5
	printf("%d\n", p[1][2]); //5
 
	printf("%d\n", *(q[1] + 2)); //5
	printf("%d\n", *(*(q + 1) + 2)); //5
	printf("%d\n", (*(q + 1))[2]); //5
	printf("%d\n", q[1][2]); //5
 
 
	int k;
	scanf_s("%d", &k);
 
    return 0;
}

 

 

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