地址

2011-12-07 32 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

輸出:地址

0045FB88 0045FB88 
0045FB88 0045FB7C 

u的輸出是有道理的。

據我所知,t&t[0]應該有相同的值,但&t也是如何來的呢? &實際上是什麼意思?

+4

¤「t」轉換爲指針和「&t」的唯一區別是指針類型。後者的引用是形式上的數組類型,所以加1會使它移動很多(到內存中下一個這樣的數組)。而前者的指稱是元素類型。術語:在[comp.lang.C++] Usenet組中,對於像u這樣的指針是否可以被稱爲「指向」該數組存在一些爭議,因爲它的對象不是數組類型。通過指出標準對這種措辭的使用,這已經解決了很多次。乾杯&hth。, –

+0

@alf不是因爲這個問題,保羅的傢伙徘徊? –

+0

@ JohannesSchaub-litb:是 –

回答

18

當在表達式中使用t時,會發生數組到指針的轉換,這會產生指向數組的第一個元素的指針。

當使用t作爲&運算符的參數時,不會發生此類轉換。 &然後明確地採用地址t(數組)。 &t是一個整體指向數組的指針。

該數組的第一個元素與整個數組的起始位置在內存中的相同位置,因此這兩個指針具有相同的值。

+0

謝謝!我想這是隱式的數組到指針的轉換,給了我一個錯誤的指針'u'的心態。 – quuxbazer

+0

@quuxbazer:'u' _is_一個指針。 ''這是一個數組。 'int * u = t'將一個數組到指針的轉換應用到't',並用結果初始化'u'。 – Mankarse

+0

-1這是不正確的描述爲C++ –

0

t是數組的地址,&t是指向數組的靜態指針,因此顯示的地址是相同的。

我發現的一個很好的參考文獻是cplusplus forum,它非常好地解釋了這個概念。

如前所述有大約&array

它是在規則不適用的例外之一。它需要它作爲指向數組的指針。它將再次指向數組的第一個元素,但是如果向此指針添加一個元素,它將指向數組最後一個元素之後的地址(就像您跳過數組一樣)。

+1

-1「&t是對數組的第一個地址的引用」不正確 –

+0

@ AlfP.Steinbach怎麼這樣? &t是對數組所使用的內存塊的開始的引用,因此,除非我通過改變措辭來混合我的含義,否則是對數組的第一個地址的引用? – Serdalis

+0

'&t'不是一個參考。它是一個指針值。注意你*可以*有一個數組的引用,但'&t'不是。 –

-2

沒有變量叫做t,因爲你不能改變它。名稱t只是指第一個元素的地址(並且還具有與其關聯的大小)。因此,考慮到地址的地址並沒有什麼意義,C將它「摺疊」成爲地址。

同樣的事情發生了功能的情況下:

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

這應該打印同樣的事情,因爲沒有變量保存的foo地址,其地址又可以採取。

+1

它是C++,並且有一個名爲't'的變量。你可以將它傳遞給接受類型爲int(&)[10]'的參數的函數。 – Abyx

+3

-1「沒有變量叫做t,因爲你不能改變它。」是不正確的。在聲明中命名的對象稱爲變量。去查找標準。 –

3

實際類型tint[10],所以&t是數組的地址。
此外,int[]隱式轉換爲int*,所以t轉換解決 陣列 陣列的第一個元素的。

+2

不,它會轉換爲第一個元素的地址。絕對的內存位置是相同的,但類型卻完全不同。 –

+0

@BenVoigt,是的,謝謝。 – Abyx