我在學習c++陣列的時候,對陣列的了解不是很深。也不知道,為什麼宣告乙個陣列,int a[10],為什麼a就是陣列的位址。
那時候老師就這樣教我們,將a理解為指向陣列頭的乙個指標,這樣就好理解了。當時這樣理解了之後確實好像豁然開朗的樣子。這樣a[5]就等於*(a+5),也就相當於將陣列頭指標向後推5個位置,然後取到該位置的資料了。彷彿一切都很完美。
可是當我對c++使用的越多的時候,就會發現這個理解越來越多紕漏。
我們知道,如果我們有乙個int陣列a[10],sizeof(a)會求出40。相信不少人都會寫過以下的**吧
int arraysize(int a)
我們想要求乙個陣列的長度,但是當我們用這個函式來求陣列的長度的時候,會發現要麼輸出1要麼輸出2。為什麼會這樣呢?
我們在c++面試的時候會遇到這樣的題目
int a[5] = ;
int* p1 = (int*)(&a+1);
int* p2 = (int*)(a+1);
cout << *(p1-1) << " " << *(p2-1) << endl;
問輸出什麼?
大家都知道輸出時5和1,那大家有沒有嘗試去理解一下為什麼是這樣呢?
為了解決這個問題,我寫了一段**進行測試:
#include#include using namespace std;
#define type(a) typeid(a).name()
int main() ;
cout << "a=" << a << " &a=" << &a << endl;
int* p1 = (int*)(&a+1);
int* p2 = (int*)(a+1);
cout << "*(p1-1)=" << *(p1-1) << " *(p2-1)=" << *(p2-1) << endl;
cout << "sizeof(a)=" << sizeof(a) << " sizeof(&a)=" << sizeof(&a) << endl;
cout << "typeof(a)=" << type(a) << " typeof(&a)=" << type(&a) << endl;
}
執行結果如下:
我們可以看到,乙個陣列a[10],a的值和&a輸出的值是一樣的。
但是對a+1和對&a+1卻會得到不同的結果。
對他們分別用sizeof函式取大小,發現a占用了40個位元組,&a占用了8個位元組。
最後我們檢視a和&a的類別,發現a是a10_i型別的,而&a是pa10_i型別的。
這說明了什麼?
說明了陣列名a並不是乙個int型的指標,而是乙個新的資料型別,是乙個a10_i型別,代表大小為10的int型的陣列。而a10_i這個資料型別是會在記憶體中連續占用10個int型的空間,所以sizeof(a)會返回乙個10*4的結果。而&a是乙個pa10_i型別,就是指向a10_i資料型別的乙個指標,乙個指標的大小當然為8了。(根據系統的位數不同而不同)。
那為什麼a和&a的輸出值相等呢?這是因為a是乙個a10_i的資料型別,輸出的時候會把裡面的陣列的頭位址輸出出來。而&a時指向a10_i的乙個指標,a10_i的位址就等同於他裡面包含陣列的頭位址,所以兩者會相等。
而&a+1與a+1得到的結果不相等,是因為a相當於乙個指向int元素的指標,a+1會加上sizeof(int)的大小。而&a是乙個指向a10_i的指標,&a+1會加上sizeof(a10_i)的大小,而sizeof(a10_i)=40,所以就可以解釋為什麼兩者不同了。
至於為什麼我們想寫乙個函式來求陣列的長度的時候會失敗,原因是我們的函式接收引數是乙個真真正正的int型指標,在傳入引數時會進行型別轉換,將pa_i型別轉化為int型指標,對int指標進行sizeof當然求得指標本身的大小。只有對陣列名這個資料型別進行sizeof求大小才能夠求得陣列本身的大小。
說到底,就是陣列名並不等同於乙個指標。陣列名是乙個我們平常不能顯式宣告的資料型別,只不過裡面包含了乙個指標,指向陣列的頭部。
c 陣列指標 指標陣列 函式指標
優先順序比 高,低於 根據這個原則去判斷 陣列指標 陣列指標即陣列的指標,是乙個指標,指向乙個陣列 也稱為行指標 int p 2 可以理解為int 2 p,但是不能這樣子定義 p是乙個指標,指向乙個陣列,陣列元素是int長度為2 二維陣列可以賦值給陣列指標 int a 3 4 int p 4 p a...
C 指標陣列與陣列指標
說實話,c語言真的很讓人蛋疼,它不像物件導向的語言,我們重心在設計程式上。而使用c語言,你不僅要考慮程式的設計,你還要考慮很多他的使用細節,不然一不小心你怎麼死的都不知道。但是,個人感覺,c語言的魅力是其他任何語言都比不了的!繼續看。陣列指標 範例 typedef int aint5 5 typed...
C指標陣列和陣列指標
測試 int main 定義二維陣列m並初始化 int p 4 陣列指標 p是指標,指向一維陣列,每個一維陣列有4個int元素 int i,j int q 3 指標陣列 q是陣列,陣列元素是指標,3個int指標 p m p是指標,可以直接指向二維陣列 printf 陣列指標輸出元素 n for i ...