int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
輸出:地址
0045FB88 0045FB88
0045FB88 0045FB7C
爲u
的輸出是有道理的。
據我所知,t
和&t[0]
應該有相同的值,但&t
也是如何來的呢? &實際上是什麼意思?
int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
輸出:地址
0045FB88 0045FB88
0045FB88 0045FB7C
爲u
的輸出是有道理的。
據我所知,t
和&t[0]
應該有相同的值,但&t
也是如何來的呢? &實際上是什麼意思?
當在表達式中使用t
時,會發生數組到指針的轉換,這會產生指向數組的第一個元素的指針。
當使用t
作爲&
運算符的參數時,不會發生此類轉換。 &
然後明確地採用地址t
(數組)。 &t
是一個整體指向數組的指針。
該數組的第一個元素與整個數組的起始位置在內存中的相同位置,因此這兩個指針具有相同的值。
t
是數組的地址,&t
是指向數組的靜態指針,因此顯示的地址是相同的。
我發現的一個很好的參考文獻是cplusplus forum,它非常好地解釋了這個概念。
如前所述有大約&array
:
它是在規則不適用的例外之一。它需要它作爲指向數組的指針。它將再次指向數組的第一個元素,但是如果向此指針添加一個元素,它將指向數組最後一個元素之後的地址(就像您跳過數組一樣)。
-1「&t是對數組的第一個地址的引用」不正確 –
@ AlfP.Steinbach怎麼這樣? &t是對數組所使用的內存塊的開始的引用,因此,除非我通過改變措辭來混合我的含義,否則是對數組的第一個地址的引用? – Serdalis
'&t'不是一個參考。它是一個指針值。注意你*可以*有一個數組的引用,但'&t'不是。 –
沒有變量叫做t
,因爲你不能改變它。名稱t
只是指第一個元素的地址(並且還具有與其關聯的大小)。因此,考慮到地址的地址並沒有什麼意義,C將它「摺疊」成爲地址。
同樣的事情發生了功能的情況下:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
這應該打印同樣的事情,因爲沒有變量保存的foo
地址,其地址又可以採取。
它是C++,並且有一個名爲't'的變量。你可以將它傳遞給接受類型爲int(&)[10]'的參數的函數。 – Abyx
-1「沒有變量叫做t,因爲你不能改變它。」是不正確的。在聲明中命名的對象稱爲變量。去查找標準。 –
實際類型t
是int[10]
,所以&t
是數組的地址。
此外,int[]
隱式轉換爲int*
,所以t
轉換解決
陣列
陣列的第一個元素的。
不,它會轉換爲第一個元素的地址。絕對的內存位置是相同的,但類型卻完全不同。 –
@BenVoigt,是的,謝謝。 – Abyx
¤「t」轉換爲指針和「&t」的唯一區別是指針類型。後者的引用是形式上的數組類型,所以加1會使它移動很多(到內存中下一個這樣的數組)。而前者的指稱是元素類型。術語:在[comp.lang.C++] Usenet組中,對於像u這樣的指針是否可以被稱爲「指向」該數組存在一些爭議,因爲它的對象不是數組類型。通過指出標準對這種措辭的使用,這已經解決了很多次。乾杯&hth。, –
@alf不是因爲這個問題,保羅的傢伙徘徊? –
@ JohannesSchaub-litb:是 –