答: 是首位址,是陣列的首位址,雖然值等於第乙個元素的位址,但是不代表元素的位址.
1. 陣列名都是位址常量,都是首位址,可以直接付給指標,但是一維陣列和二維陣列名 賦予指標時有點不一樣.
2.陣列名不是指標,它僅僅是個 位址常量
3. 一維陣列的陣列名 直接付給指標, 如 int a[3]; int *p=a;
4. 二維陣列名 直接賦給指標 就錯了... 如 int a[3][4]; int *p =a; 就是錯誤的; int *p = a[0] ; 就對了.
5. 二維陣列 對應的是二維陣列的指標, 這樣定義: int (*p) [4] ; p=a 就對了
#include #include using namespace std;
void main()
, ,
};int * p ;
// p=a ; 錯誤
p =a[0]; // ok
for(int i=0;i<12;i++)
cout<
為什麼 p=a 是錯的.?
#include #include using namespace std;
void main()
, ,
};int * p ;
// p=a ; 錯誤
p =a[0]; // ok
for(int i=0;i<12;i++)
cout<
// --- 摘錄其他網友的解釋:
片段:int a[3][3]=,,};
int *p;
p=a; //? a是這個二維陣列的首位址,但為什麼p=a就不行?
cout<ans ----------->
資料型別不同
p是指向int的指標
a可以看成指向int [3]的指標
int 和 int [3]不是同樣的型別,
前者是簡單資料型別,後者是由簡單資料型別構成的陣列型別.
正因為這兩種資料的型別不同,所以指向它們的指標的型別也不同.
指標運算是按照指標的型別進行的,
所以p++只使p移動乙個整數所佔的位元組長度,
a++卻移動了三個整數所佔的位元組長度,
由指標運算就可以看出這兩個指標不是同型別的.
不過指標間的強制轉換一般都還可行,
因而可以如下:
p=(int*)a;
雖然 a 和 a[0] 的型別不同,但它們的值是一樣的.
但值一樣卻未必是同樣的資料型別!
ans ----------->
在除了sizeof、&和字串常量之外的表示式中,array type會被自動轉換為pointer type。
對於p=a;這一句,a的型別是array type,就是int[3][3],a在賦予p之前,
其型別先被自動轉換為pointer type,就是int(*)[3],轉換的結果是指向陣列的指標,
而p的型別是int*,是指向整數的指標,兩者型別不相容,不能直接賦值。
a[0]的型別也是array type,就是int[3],
同樣地,在表示式p=a[0]中a[0]也會先被自動轉換為pointer type,
就是int*,跟p的型別相容,因此可以p=a[0]。
ans ----------->
解釋如下:
例如int a[2][4]是乙個二維陣列,包含8個元素
這個陣列表示為什麼呢:
表示為a陣列有兩個元素(可以想象成乙個結構,由4個int組成)
a就是這個陣列的指標,指到a這個二維陣列的第乙個元素,即a[0](4個int組成的)
當你賦值的時候,編譯器認為a是乙個4元素的結構,而p是乙個int指標,型別不匹配,因此錯誤.
而a[0]則是a[0][0]的位址,a[0]的型別是int *,與p匹配,因此可以.
二維陣列和二維陣列名
對於一位陣列我們認識到其資料元素在記憶體中是按線性順序依次排列的,且一維陣列名的值是乙個指標常量。那麼二維陣列在記憶體中又是怎麼儲存的,其陣列名又有什麼含義呢?定義乙個二維陣列 int arr 3 4 我們可以將乙個二維陣列看做是乙個其中元素為陣列的乙個一位陣列,也就是說二維陣列第一維的元素實際上是...
二維陣列名 二維陣列名取位址 二級指標
先給出結論,便於以後查閱 首先給出幾個定義 typedef int p1x4 4 定義資料型別,p1x4這種型別為指向含4個int元素的1維陣列的指標 typedef int p3x4 3 4 定義資料型別,p3x4這種型別為指向含3x4個int元素的2維陣列的指標 下面從一維陣列說起 定義 int...
C 指標陣列,陣列指標,陣列名,二維陣列
本文較為詳細的分析了關於理解c 指標陣列,陣列指標,陣列名,二維陣列的一些技巧。是比較重要的概念,相信對於大家的c 程式設計有一定的幫助作用。一 關於陣列名 假設有陣列 1 inta 3 1.陣列名代表陣列第乙個元素的位址,注意,不是陣列位址 雖然值相等 是陣列第乙個元素位址,a 等同於 a 0 a...