問題:
int ia[2] = ;
cout << &ia 《執行結果如下
0012ff38
0012ff38
我想問一下,如果說ia是的值是陣列第乙個元素的位址,即&ia[0],那麼ia作為乙個變數也應該有乙個位址,這個位址的值為什麼也是和&ia[0]一樣呢?如果說
*(&ia)=*(&ia[0])=a[0]=1;(因為&ia的值和&ia[0]的值相等)
但是*(&ia)=ia=&ia[0]=0012ff38才對啊?
0012ff38處儲存的是整數值1(*(&ia[0])=ia[0]=1),
還是位址值0012ff38(*(&ia)=ia=0012ff38呢?
大家討論一下,我 也沒有弄明白?
回答:陣列是乙個型別,這是勿容置疑的。如 int ia[2] = ; 中,ia的型別是int[2]。
因此,ia是乙個變數,這也是勿容置疑的,它是型別為int[2]的變數。
既然是變數,就需要分配記憶體空間,就有位址,這也是肯定的。本例中,陣列變數ia的位址就是0012ff38。它即是int[2]變數ia的位址,也是int變數ia[0]的位址,所以&ia = &ia[0]這點是很容易理解的,因為陣列的記憶體就是這麼分配的。
問題在於為什麼(ia==0012ff38)。這裡就要考慮陣列型別的特殊性了。是的,ia是乙個陣列變數,但是ia可以隱式轉換成乙個指標常量(注意是 t* const,不是const t*,即這個指標本身儲存的位址不會變化,永遠是&ia,但是這個位址上的值,即ia[0]是可變的)。
具體地說,如果int[2]是乙個類class int_2,那麼編譯器是這麼寫int_2的:
class int_2
....
}所以,在對ia直接訪問時,你看到值其實是其this指標地值,即ia == &ia,它的實質是
int* const pia = &ia;
pia == &ia
當然就是正確的了。
提供這個隱式轉換是為了方便陣列的訪問。比如ia[1],它等價於*(ia+1),也就等價於
int* const pai = &ia;
*(pia+1)
當然就可以訪問陣列下標為1的元素了。
(注意 a[n] 與 *(a + n) 永遠是等價的。比如你會發現 ia[1] == 1[ia].因為在幾乎所有的編譯器中,a[n]都是先翻譯成*(a+n)再進一步編譯的)
隱式轉換是在所有需要時有編譯器自動完成的。比如做 *(ia)時,由於int_2沒有提供*操作符,而所有指標都提供了操作符,所以將ia轉換成(int* const)&ia了,同樣的,*(ia+1)的例子因為要完成+操作而做了轉換,ia[1]則是定義了
int& int_2::operator(size_t idx) 在這個函式體內部做了隱式轉換。
因此,當發現 ia == &ia 時沒必要感到奇怪,這只是為了完成==操作而做了一次隱式轉換罷了。
對於樓主提出的問題,結論如下:
1、&ia == &ia[0] == 0012ff38 成立,因為ia,ia[0]的位址都是0012ff38
2、0012ff38處儲存的是整數值1 成立,因為ia[0] = *(ia) = 1 //此處*(ia)做了隱式轉換
3、*(&ia) == ia == &ia[0] == 0012ff38 成立,
其中*(&ia) == ia 是同一律,ia == &ia[0] 左式做了一次隱式轉換
4、*(&ia) == *(&ia[0]) == a[0] == 1 不成立!!
其假設成立的依據是&ia == &ia[0]。但是它們雖然是乙個位址,但不是同乙個型別的指標!不同型別的指標在進行==評估時,可以轉成size_t做比較,但當它們分別進行&操作時,其型別差別就顯示出來了。&ia的型別時(int[2])* ,或按上面說的,寫成int_2* 。而&ia[0]的型別則是int*。如此*(&ia)的型別是int_2;而*(&ia[0])型別int 。int2本身沒有定義==操作,只能通過隱式轉換成int* const,此時它的值就和*(&ia[0])完全不一樣了。
所以*(&ia) == 0012ff38 正確,*(&ia) == 1 錯誤。這並不矛盾,只要你知道編譯器定義了乙個陣列到指標常量的隱式轉換就行了。
關於陣列首元素位址與陣列首位址的區分
如果定義乙個陣列a 則陣列名a和 a 0 表示陣列首元素的位址,而 a則表示陣列的首位址,通過下面這個經典的程式則可以理解它們的區別 include int main int p a 1 int pp int a 1 printf d n p printf d n pp 1 return 0 在vs...
菜鳥學習C語言 陣列位址與陣列元素位址
定義乙個結構體陣列 typedef struct test t test t c 3 那麼c c c 0 有什麼區別和聯絡呢?陣列名c代表陣列第乙個元素的指標,指向第乙個元素 即 c 0 陣列中的其它元素可以通過c的位移得到,即c i c i 所以c和 c 0 意義是一樣的。c數值上等於整個陣列的首...
陣列 陣列名 陣列位址
這裡取出的是整個陣列的位址。計算的是整個陣列的大小,單位是位元組。除此之外,遇到的所有的陣列名都表示陣列首元素的位址!一維陣列 int a printf d n sizeof a 16 這裡的陣列名a表示整個陣列,計算整個陣列的大小,也就是4個整數,整型佔4個位元組,所以整個陣列的大小是4 4 16...