指針數組與數組指針----從一維到二維

這是一個很容易混淆的概念

int *p1[5]int (*p2)[5]

第一個就是一個指針數組
[ ]的優先級比*高,所以p1會先於[ ]結合,成爲數組,再和指針結合,成爲數組指針,也就是數組中每一個元素都是一個指針

指針數組是數組,即-一個數組中,每個元素都是指針。

在這裏插入圖片描述

第二個就是一個數組指針
()的優先級比[ ]高,所以*p先構成一個指針,再和[ ]構成一個數組
所以p2是一個指針,指向的是包含5個int 數據的數組

數組指針是指針,即一個指向數組的指針

下面舉一個例子

int arr[5]={12345};
int (*p1)[5] = &arr;
/*下面是錯誤的*/
int (*p2)[5] = arr;

我們都知道,數組名arr是數組首元素的地址,而&arr是整個數組的首地址
但是在c語言裏面,上面的是正確的,下面的確是錯誤的

在 C 語言中,賦值符號“=”號兩邊的數據類型必須是相同的,如果不同,則需要顯示或隱式類型轉換。

在這裏面,p1和p2都是數組指針,指向的是整個數組
而&arr是整個數組的首地址,也是指向的整個數組
但是,arr卻是數組首元素的地址,指向的是單個元素,數據類型不一樣,就會發生錯誤

下面我們來到二維數組
我們定義了一個二維數組

#include<iostream>
using namespace std;
int main()
{
	int a[2][3]={{1,2,3},{4,5,6}};
	cout<<"a的值是:"<<a<<endl;
	cout<<"*a的值是:"<<*a<<endl;
	cout<<"*a[0]的值是:" <<a[0]<<endl;
	cout<<"*a[0][0]的值是:" <<&a[0][0]<<endl;
	cout<<"a[0][0]的值是:" <<a[0][0]<<endl;
	return 0;
}

下面是他的運行結果
在這裏插入圖片描述
我們可以看到 a ,*a ,*a[0] ,*a[0][0],這四個值是一樣的,那麼是不是就代表他們四個也相同呢?
當然不,他們的類型不同
a 是整個數組的首地址,a[0] 是數組第一行的首地址,雖然值相同,但是含義不同,也就是類型不同
a 是相對於整個數組來說,a[0] 是相對於第一行來說
也就是,a是int *[3]類型

這裏就需要再次說明一下爲什麼是int *[3]類型
p是一個指針變量,它指向包含3個int元素的一維數組,此時p的增量以它所指向的一維數組長度爲單位;
(p+i)是一維數組a[i][0]的地址;
(p+2)+3表示a[2][3]地址(第一行爲0行,第一列爲0列),
(p+2)+3)表示a[2][3]的值。

a[0]是int *類型
如果將a[0] 改爲&a[0] , 那麼a和&a[0] 是相同的

在這裏插入圖片描述

下面我們再看一個例子,這道題的正確答案是c

A
定義了一個二維數組
看一下報錯信息
在這裏插入圖片描述
提示類型轉換錯誤
pa應該定義爲 (*pa)[5] ,[ ]裏面的數字應該是二維數組每一行元素的個數

B
定義了一個指針數組
後半句也是錯誤的
左邊是一個數組,而右邊只是一個元素的指針,類型不同

C
是正確的
定義了一個指針數組,c數組的每一個元素已經是指針了,再取數組名就又加了一個指針,左邊也是指針的指針,類型相同

比如一維數組
int s[2]={1.2};
那麼s就是1的指針
也就是說,只取數組名,就相當於加了一個指針,如果數組中的元素本來就是指針,那不就是指針的指針了麼

D
右邊是二級指針,左邊只是一級指針,所以錯誤

就是說如果你將一個n級指針賦給指針變量,定義這個指針變量就得用n個*表示

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