2012-08-08 31 views
3

根據this由數組到指針的衰減存儲中的編譯器生成的指針在哪裏?

指針沒有被存儲在陣列本身(或其他任何地方在存儲器中)時的陣列 衰減到指針的一部分。

如果上述語句爲真,如何能&陣列的數據類型陣列&陣列[0]但所有三個具有在下面的聲明相同的值是不同的。

int array[10]; 

我以爲編譯器默默地衰減數組到指針時,應該給指針一些內存地址。如果不是,那麼指針的存儲位置在哪裏?

在此先感謝。

+1

當你引用某些東西/某人時,通常(閱讀:總是)給出引用來源的一個好主意,在這種情況下,[這個答案](http://stackoverflow.com/questions/4810664/how -DO-I-使用陣列式-C/4810668#4810668)。 – netcoder 2012-08-08 18:39:30

+1

這是關於通過非參考傳遞的函數參數中使用** sizeof()**得到錯誤結果嗎? – 2012-08-08 18:43:21

+0

@tuğrulbüyükışık:'sizeof'永遠不會給出錯誤的結果。 :) – netcoder 2012-08-08 18:49:30

回答

3

當你在表達array使用地址運算符,表達array不會衰變到指針(同樣當使用sizeof,當您使用typeid,當你傳遞數組作爲參數,其中正式參數是對數組的引用)。在其他表達式中,通常會指向第一個元素。

給出的聲明

int array[10]; 

&array類型是int (*const)[10]其中類型的&array[0]是在其衰變表達式int *const ==類型的array

+0

謝謝,但如果你同意這個說法,它說,指針不是數組的一部分,也不存儲在內存中的任何其他地方,所以當指針衰減到指針時,指針存儲在哪裏? – user1585554 2012-08-08 19:01:56

+0

如果我沒有弄錯,它將存儲在程序運行的處理器的寄存器(或等價物)中,如果除了在語句中引用它而使用衰減的指針之外沒有做任何其他更多的操作,然後忽略它從那時起。然而,當你將它傳遞給某個函數或將它分配給某個東西時,它確實會將該衰減的指針存儲在內存中的某處(或者可能不是,這取決於哪些優化處於活動狀態以及如何使用指針)。或類似的東西。 – JAB 2012-08-08 19:09:19

+0

@ user1585554腐朽指針存儲在內存中直到表達式最後 – 2012-08-08 19:19:05

1

http://ideone.com/Qw1aA,&array,array&array[0]可以看出,它們都代表相同的值:數組中第一個元素的內存地址。

但是,僅僅因爲兩個值是相同的並不意味着它們表示相同的東西;在這種情況下,它是一種語義差異(這仍然很重要,例如,對於常規數組,您可以使用sizeof()在C中查找其長度(以字節爲單位),而如果您通過數組代替指針參數)。

此外,即使一個函數在它的參數數組類型,結果不會在陣列中經過時,如圖http://ideone.com/jAeAn,因爲指針的分解是在函數內部相同,如圖錯誤留言在這裏:http://ideone.com/yn0zc

+0

'&array'實際上有一個不同的* type *(指向10個int的數組的指針)而不是另外兩個(指向int的指針),即使* values *轉換爲void *或任何整數類型,都將是相同的。例如,如果'sizeof(int)== 4',那麼'&array + 1'將指向超過'array'開頭的40個字節,而'array + 1'和'&array [0] + 1'指向開始4個字節。 – 2012-08-08 18:58:05

+0

也許我錯誤地使用了「語義」。我正是這個意思;即使值相同,編譯器處理值的方式也是不同的,比如文字「0」和「0f」由相同的位表示,它們本身表示相同的值,但也是不同的類型。 – JAB 2012-08-08 19:07:00

2

這是表達評估的一部分。當編譯器評估任何表達式(例如3+4,(unsigned int) 3&array[3]或簡單地array)時,它通常通過執行處理器寄存器中所需的任何計算來管理以各種方式發生的所有臨時值。當你使用一個數組名作爲指針時,編譯器通常會產生指令將數組的地址加載到一個寄存器中,然後執行你指定的任何指針來處理指針。

4

我沒有看到你在哪裏得到指針必須存儲在某處的想法。出於什麼目的?沒有C++代碼需要將指針存儲在任何地方。

當抽象C++機評估類似

int a = 2, b = 3, c = 4; 
int i = (a + b) * c; 

內子表達式a + b的計算結果爲5。但是,從語言的角度來看,5並不是真的存儲在任何地方。這只是暫時的價值5,存在一個短暫的時刻只能乘以c並永遠被遺忘。這種非物質的C++表達結果稱爲右值。通常情況下,rvalues居住的地方是不明確的。在上述表達式的評估期間,5的值可能會在某些CPU寄存器中出現片刻。或者,如果編譯器決定這樣做,它甚至可能暫時存儲在某個未命名的內存區域中,但這不是您在C++代碼級別可以看到的。

從數組到指針的轉換所產生的指針也是如此。該指針是一個右值 - 一個臨時值,它不會在內存中的任何位置生存。它根本不需要生活在記憶中的任何地方。

您不清楚您的&array參考文獻所表達的內容。表達式&array不涉及數組到指針的轉換,這意味着它與所討論的問題沒有任何關係。

+0

謝謝。通過使用**&array **,我的意思是它具有與**&array [0] **或** array **相同​​的值,但是指的是連續的內存塊,編譯器如何解決這個問題?兩種不同的數據類型可能共享相同的內存地址嗎? – user1585554 2012-08-08 19:25:37

+0

「兩種不同的數據類型可能共享相同的內存地址嗎?」當然這是可能的。事實上,C的一種語言特性爲您提供了一種明確的方式來表明這一點。 http://publications.gbdirect.co.uk/c_book/chapter6/unions.html – JAB 2012-08-09 11:37:22