請問一下c語言中的far和near怎麼用?書上好像沒介

時間 2022-02-09 20:55:04

1樓:

near指標和far指標?

在dos下(真實模式)地址是分段的,每一段的長度為64k位元組,剛好是16位(二進位制的十六位)。

near指標的長度是16位的,所以可指向的地址範圍是64k位元組,通常說near指標的定址範圍是64k。

far指標的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指標是20位的長度。)即可得到far指標的1m位元組的偏移量。所以far指標的定址範圍是1m位元組,超過了一個段64k的容量。

例如一個far指標的段地址為0x7000,偏移量為0x1244,則該指標指向地址0x71224.如果一個far指標的段地址是0x7122,偏移量為0x0004,則該指標也指向地址0x71224。

如果沒有指定一個指標是near或far,那麼預設是near。所以far指標要顯式指定。far指標工作起來要慢一些,因為每次訪問一個far指標時,都要將資料段或程式段的資料交換出來。

另外,far指標的運算也比較反常,例如上面講到的far指標指向同一個地址,但是比較的結果卻不相同。

什麼時候使用far指標?

當使用小**或小資料儲存模式時,不能編譯一個有很多**或資料的程式。因為在64k的一個段中,不能放下所有的**與資料。為了解決這個問題,需要指定以far函式或far指標來使用這部分的空間(64k以外的空間)。

許多庫函式就是顯式地指定為far函式的形式。far指標通常和farmalloc()這樣的記憶體分配函式一起使用

2樓:

正解在dos下(真實模式)地址是分段的,每一段的長度為64k位元組,剛好是16位(二進位制的十六位)。

near指標的長度是16位的,所以可指向的地址範圍是64k位元組,通常說near指標的定址範圍是64k。

far指標的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指標是20位的長度。)即可得到far指標的1m位元組的偏移量。所以far指標的定址範圍是1m位元組,超過了一個段64k的容量。

例如一個far指標的段地址為0x7000,偏移量為0x1244,則該指標指向地址0x71224.如果一個far指標的段地址是0x7122,偏移量為0x0004,則該指標也指向地址0x71224。

如果沒有指定一個指標是near或far,那麼預設是near。所以far指標要顯式指定。far指標工作起來要慢一些,因為每次訪問一個far指標時,都要將資料段或程式段的資料交換出來。

另外,far指標的運算也比較反常,例如上面講到的far指標指向同一個地址,但是比較的結果卻不相同。

c語言中一個關於near簡單問題

3樓:匿名使用者

給_systemaudio 聯合體,取了別名systemaudio

然後用systemaudio型別定義了一個near變數sysaudio

near是段內修飾符,在32位編譯器,near或者far沒有用處

4樓:匿名使用者

near、far、huge關鍵字的真正含義是什麼?

這三個關鍵字只能用於修飾函式、全域性變數和指標變數,對於非指標型別的區域性變數,這些關鍵字沒有實際意義。

這些關鍵字用於修飾函式時,huge的含義與far相同,用於指明該函式的呼叫方式為far呼叫方式,即呼叫時需要一個段值和一個段偏移組成的32bits呼叫地址,使用far call進行跳轉,跳轉前先壓棧儲存當前cs:ip。near修飾函式時,用於指明該函式的呼叫方式為near呼叫方式,呼叫時只需要一個16bits的近地址,即當前cs的段內偏移。

當這三個關鍵字用於修飾指標時,near型指標實質上為16bits的無符號整型數,該整數給出了所指向變數在當前資料段內的偏移地址,也就是說,在使用near型指標定址時實際上是進行如下的定址操作:[ds:指標變數值]。

對於far型的指標變數,可以定址1mb地址空間的任意一個地方,far型指標的實質是一個32bits的整型數,高16bits為段值,低16bits為段內偏移,turbo c中在使用far型指標時,會先將高16bits放入es暫存器中,然後再進行如下的定址操作:[es:指標變數低16bits值]。

對於hug型的指標變數,與far性指標變數的不同之處在於,在對far型指標變數進行+/++/-/--等操作時,far型指標變數保持段值不變(也就是高16bits),而只對段內偏移進行加減操作,所以會出現段內迴繞的現象,而huge型的指標,在進行加減操作時將會自動的改變段值,不會出現段內迴繞。所以給人的感覺就是huge指標能比far指標定址更大的記憶體空間。

c語言**現的far是什麼意思

5樓:

int far 或者 void far 表示要編譯器給宣告的這些量分配在 遠處的儲存器(ram)中,即分配到 64k 以外的 儲存地址中。

64k 作為一個「段」(segment),是 pc 機 80x86 時期的老概念。超過64k 就是 「遠」, far 就是 「遠」de 英文。

編譯器對near(近)和far(遠)的處理略有不同。

新的編譯器預設應當是遠。

6樓:枕著理想入睡

只不過是一個被定義的符號而已,作用和a、b、c那些是一樣的。為的是自己好認。

7樓:du瓶邪

近指標、遠指標,這是16位cpu造就的,但32位以上的cpu沒有。

16位cpu(主要指80386和80486)內部陣列匯流排為16位,地址匯流排為24位。這就意味著一個字(16bit)存不下一個地址,要用到兩個字。

習慣把高位字稱為段地址,低位字稱為偏移地址。

程式執行時,os會給程式分配幾個記憶體段供程式使用,主要的有**段(cs)、資料段(ds)、堆疊段(ss)。根據不同的編譯模式這幾個段可能重合。

當指標指向的地址與資料段的段地址相同(即處於資料段內),這時可以不記錄段地址而僅記錄偏移地址(只需16bit)。這種指標稱為近指標(near指標)。

當指標指向的地址與資料段的段地址不同(即處於資料段外),這裡不僅要記錄偏移地址還要記錄段地址(共需32bit)。這種指標稱為遠指標(far指標)。

可以測試:

sizeof(int near*)和sizeof(int far*)的返回值分別是2和4。

c 語言中變數定義為near

8樓:匿名使用者

這是歷史遺留問題,dos系統執行於intel的8086/8088這個16位cpu,但這cpu有20條地址匯流排,16位的暫存器就無法直接定址20位的地址,於是搞出來一個段偏移的概念,把1m的記憶體空間按64k分段, 以段地址+偏移地址的方式實現20位地址。cpu有許多預先設計好的段暫存器,程式執行的時候,存放在資料段暫存器(ds)中的段地址被當作一個預設的段地址,這64k空間就被稱為近程空間(near)。既然有近程空間,那麼就有遠端空間:

位於ds段以外的地址空間就叫遠端空間(far)。如果不顯式宣告,預設使用近程空間

unsigned char near variable; //在近程空間(ds段)建立一個變數 variable

unsigned char varible ; //沒有顯式宣告,同樣是near變數

對於unix/linux/windows這些32位作業系統,對記憶體的操作是線性的,也就沒有near和far的區別了

關於16位段記憶體的詳細內容,你可以參考8086/8088組合語言以及16位的c語言系統手冊(比如turbo c的程式設計師手冊)

9樓:匿名使用者

這個與c語言的功能無關, 只是基於硬體特性.

微控制器中, 因為指令長度及資料長度的cpu操作限制, 對於ram/rom位置的操作, 有些會區分 變數 距離 操作指令 其兩者之間的距離.

當距離較近, 也許單一指令就能存取, flash小, 且速度快.

當距離較遠, 會採取多指令組合, 或是佔時較久的操作指令來處理.

這個依照硬體特性不同而採用.

ps. 以上是個人印象, 如有訛誤歡迎指正.

c語言中函式前面的far是什麼意思

10樓:旁笑槐

如果學過彙編應該知道近指標和遠指標,far就是表示遠指標,其實還有關鍵字near,near表示16位定址,指標長度16位,far表示20位定址,指標長度20位。在32位系統中,記憶體管理為4g平坦模式,統一用32位指標,因此far和near僅僅是相容的需要。不少編譯器都直接這樣定義:

#define far

#define near

11樓:童童看熱點

關於孤島驚魂的十個事實!far cry到底是什麼意思

c語言中 》和 的區別,c語言中 a a 和 a 的區別

1 指向不同 一般情況下用 只需要宣告一個結構體。格式是,結構體型別名 結構體名。然後用結構體名加 加域名就可以引用域 了。因為自動分配了結構體的記憶體。如同 int a 一樣。而用 則要宣告一個結構體的指標,還要手動開闢一個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用 正確引用。否...

c語言中a 和 a的問題

靖健幸巍 在前先加1再進行運算,在前的運算級別比 優先順序高 在後先賦值再預算,在後的優先順序比 號優先順序低。第一次輸出結果為 a 5,b a 1 a 1 1 20 第二次輸出結果為 b a 1 a 1 16,a a 1 5 紀融雪貴鑠 inta 0 a 這個時候先賦值然後才加,所有a 0 a,先...

請教c語言中的問題,請教一個c語言中的問題?

不對int n n 意思是定義了一個指標變數n指向int型 n 等價於 n 就是先取n指向變數的值 然後讓n 1 n也就是讓n指向下一地址 而且這樣用必須先給n賦一個安全的地址才行 對啊,你用 幹什麼,有不是指標.就是 號自增 資深癩 int n n 或者int n n 以上都行 兩個的區別是 n ...