2013-01-31 80 views
2

另外,遠近指針......任何人都可以詳細闡述一下?C++中的指針與彙編語言中的指針之間的區別?

在C++中,我對指針的直接操作碼級別是如何工作的,或對電路級不知道,但我知道它的內存訪問其他內存,反之亦然等

但在大會你也可以使用指針。

是否有任何顯着的區別在這裏,是值得了解的,或者是同一個概念?它是否適用於低級別微處理器專用組件的肺炎級別?

+0

近和遠是過去的(大部分)的事情。指針只是一個內存地址,一個數字。從指針算術 – imreal

+0

除此之外,我知道他們是在存儲空間是相同的,只是一個ADRESS。我猜想C中的所有指針本質上都是遠指針,但編譯器可能會將其優化爲接近指針。 – Spidey

+0

C和程序集之間的唯一區別是C指針有一個關聯的類型。因此,算術意味着稍微不同的東西(編譯器將使用類型信息來確保類型的跨度是正確的)。 –

回答

2

一般,指針的東西,可以讓你訪問別的東西,因爲它指向它。
在計算機中,「東西」和「別的東西」是存儲器內容。由於內存是通過指定其內存地址來訪問的,因此指針(something)是存儲其他內存地址的內存位置。
在編程語言,高級別或彙編程序中,您給內存地址起一個名稱,因爲名稱比內存地址(通常以十六進制數字的形式)更易於記憶。該名稱是編譯器(高級別)或彙編器(機器級別)與十六進制數字或存儲十六進制數字的變量(內存位置)完全相同的常量名稱。
因此,像C++這樣的高級語言或像彙編器這樣的低級語言的指針概念沒有區別。

0

再遠/近:

在過去,一些平臺,特別是16位的DOS和16位Windows,使用的內存段的概念。近指針指向一個假設的默認段,基本上只是一個偏移量,而遠指針包含段部分和偏移量部分,因此可以表示內存中的任何地址。

在DOS中,有許多不同的內存模型可以選擇用於特定的C/C++,其中只有一個數據段,因此所有數據指針都隱式靠近,幾個只有一個代碼段,其中代碼和數據指針都遠的地方,依此類推。

與段編程是一個真正的PITA。

6

遠近指針只針對16位操作系統有關。忽略它們,除非你確實需要它們。您仍然可以在今天的編譯器中找到關鍵字以實現向後兼容,但實際上它們不會做任何事情。在16位而言,一個near指針是16位的偏移量,其中所述存儲器段已經由上下文已知和far指針包含兩個16位段和16位偏移量。

在彙編器中指針簡單地指向的存儲器位置。在C++中也是如此,但在C++中,內存可能包含一個對象;取決於指針的類型,地址可能會改變,即使它是同一個對象。考慮以下幾點:

class A 
{ 
public: 
    int a; 
}; 

class B 
{ 
public: 
    int b; 
}; 

class C : public A, B 
{ 
public: 
    int c; 
}; 

C obj; 
A * pA = &obj; 
B * pB = &obj; 

pApB是不相等的!他們會指向C對象的不同部分;當您將指針從一種類型轉換爲另一種類型時,編譯器會進行自動調整。由於它知道班級的內部佈局,因此可以計算正確的偏移量並應用它們。

0

除了什麼大家都在說關於近/遠:不同的是,在C++中,指針類型 - 編譯器知道他們是在指指點點,做一些幕後解決算術你。舉例來說,如果你有一個int *p和訪問p[i],編譯器增加了4 *我到p價值,並在該地址訪問內存。這是因爲一個整數(在大多數現代操作系統中)是4個字節長。與指向結構/類的指針相同 - 編譯器將靜靜地計算結構中數據項的偏移量並相應地調整內存地址。

隨着組件存儲器訪問,沒有這樣的運氣。在彙編層面上,從技術上講,幾乎沒有可變數據類型的概念。具體來說,整數和指針幾乎沒有區別。當你處理大於一個字節的數組時,跟蹤數組項的長度是你的責任。