之所以會出現上面的輸出結果是因為:#include
using namespace std;
intmain()
,};//a是乙個大小為3的一維陣列,陣列中的每個元素都指向乙個char [2]型別的資料;
char
(*b)[2
];//b是乙個指向char陣列的指標,陣列的大小是2;
b = a;
//從這兒可以看出二維陣列名代表乙個指向char [2]型別的指標
cout <<
sizeof
(*b)
<< endl;
//輸出2,即b指標所指向的型別(char [2])的大小=1*2=2;
cout <<
sizeof
(*a)
<< endl;
//輸出2;
cout <<
*a << endl;
//輸出abcd。原因見下面的解釋1
cout <<
*b << endl;
//輸出abcd
cout <<
*(a+2)
<< endl;
//無輸出,原因見下面的解釋2;
int a[10]
;int
* b=new int[10
];cout <<
sizeof
(a)
cout <<
sizeof
(b)<< endl;
//4,即指標本身佔據的空間是32位=4位元組;
return0;
}
1、cout在輸出字元陣列時,類似於c語言使用s%進行格式化輸出,因此在輸出*a時,通過』\0』來停止輸出,所以即使b指標指向的型別是 char [2],系統輸出ab之後,由於沒有發現』\0』,就繼續輸出cd字元。
2、由於乙個3行2列的二維陣列,前兩行賦了初值abcd,第三行由於沒賦值,我猜測系統可能在』d』字元的下一位元組賦值了』\0』,所以系統在輸出時,輸出到d就結束了。
3、假如說我們把a[3][2]這個二維陣列的行數改為2行,即a[2][2],程式輸出時,除了abcd之外還有一些其他的字元,即類似於「abcdj」這樣的東西。原因和第1點相同,程式以找到『\0』為結束輸出標誌,輸出abcd之後,由於沒有找到』\0』,所以就繼續輸出奇怪字元了;
4、請注意上述**中是如何通過指標來對二維陣列進行操作的,不是通過二級指標(形如:char **p)!是通過一級指標,只不過這個指標指向的資料型別還是乙個一維陣列而已!那二級指標有什麼用?和一級指標的用法是類似的,一級指標是用來幹嘛的?在進行函式的引數傳遞的時候,通過一級指標進行引數傳遞,可以在子函式內修改指標指向的內容。那麼同樣的,通過一級指標的指標(即二級指標)進行函式的傳參,在子函式內可以修改該一級指標的指向。詳細見[2]
參考:[1] sizeof(陣列名)和sizeof(指標)
[2] 二級指標的作用詳解
[3] 二維陣列和二級指標(真的沒什麼關係)
C 指標陣列,陣列指標,陣列名,二維陣列
本文較為詳細的分析了關於理解c 指標陣列,陣列指標,陣列名,二維陣列的一些技巧。是比較重要的概念,相信對於大家的c 程式設計有一定的幫助作用。一 關於陣列名 假設有陣列 1 inta 3 1.陣列名代表陣列第乙個元素的位址,注意,不是陣列位址 雖然值相等 是陣列第乙個元素位址,a 等同於 a 0 a...
二維陣列名 二維陣列名取位址 二級指標
先給出結論,便於以後查閱 首先給出幾個定義 typedef int p1x4 4 定義資料型別,p1x4這種型別為指向含4個int元素的1維陣列的指標 typedef int p3x4 3 4 定義資料型別,p3x4這種型別為指向含3x4個int元素的2維陣列的指標 下面從一維陣列說起 定義 int...
二維陣列和二維陣列名
對於一位陣列我們認識到其資料元素在記憶體中是按線性順序依次排列的,且一維陣列名的值是乙個指標常量。那麼二維陣列在記憶體中又是怎麼儲存的,其陣列名又有什麼含義呢?定義乙個二維陣列 int arr 3 4 我們可以將乙個二維陣列看做是乙個其中元素為陣列的乙個一位陣列,也就是說二維陣列第一維的元素實際上是...