3 回答

TA貢獻1801條經驗 獲得超8個贊
指針減法產生相同類型的兩個指針之間的數組元素的數量。
例如,
int buf[10] = /* initializer here */;
&buf[10] - &buf[0]; // yields 10, the difference is 10 elements
指針比較。例如,對于該>關系運算符:在>操作的產率1,如果在左手側上的尖的數組元素或結構構件是在右手側上的尖的數組元素或結構構件和后它產生0否則。記住數組和結構是有序序列。
&buf[10] > &buf[0]; // 1, &buf[10] element is after &buf[0] element

TA貢獻1831條經驗 獲得超4個贊
這里有幾個答案說明指針是數字。這不是C標準指定的指針的準確描述。
在很大程度上,您可以將指針視為數字,并將其視為內存中的地址,前提是(a)您理解指針減法將差異從字節(jié)轉換為元素(被減去的指針類型),以及(b)您了解此模型中斷的限制。
以下使用1999 C標準(ISO / IEC 9899,第二版,1999-12-01)。我希望以下內容比請求者要求的更詳細,但是,鑒于此處的一些錯誤陳述,我認為應該給出準確和準確的信息。
根據6.5.6第9段,您可以減去指向同一數組元素的兩個指針或者超過數組最后一個元素的指針。所以,如果你有int a[8], b[4];
,你可以從指向[2]的指針中減去指向[5]的指針,因為[5]和[2]是同一數組中的元素。您也可以從指向[8]的指針中減去指向[5]的指針,因為[8]是一個超過數組最后一個元素的指針。(a [8]不在數組中; a [7]是最后一個元素。)你不能從指向b [2]的指針中減去指向[5]的指針,因為a [5]不在與b [2]相同的數組?;蛘撸鼫蚀_地說,如果進行這樣的減法,則行為未定義。請注意,它不僅僅是未指定的結果; 你不能指望你會得到一些可能無意義的數字:行為未定義。根據C標準,這意味著C標準沒有說明結果會發(fā)生什么。您的程序可以給您一個合理的答案,或者它可以中止,或者它可以刪除文件,所有這些后果都符合C標準。
如果執(zhí)行允許的減法,則結果是從第二個指向元素到第一個指向元素的元素數。因此,a[5]-a[2]
是3,并且a[2]-a[5]
是-3。無論什么類型,a
都是如此。需要C實現來將距離從字節(jié)(或它使用的任何單位)轉換為適當類型的元素。如果a
是每個八個字節(jié)的雙精度數組,那么a[5]-a[2]
對于3個元素則為3。如果a
是每個字節(jié)的char數組,那么a[5]-a[2]
對于3個元素則為3。
為什么指針不僅僅是數字?在某些計算機上,尤其是舊計算機上,尋址內存更復雜。早期的計算機有小的地址空間。當制造商想要制造更大的地址空間時,他們還希望保持與舊軟件的一些兼容性。由于硬件限制,它們還必須實現各種用于尋址存儲器的方案,并且這些方案可能涉及在存儲器和磁盤之間移動數據或者改變處理器中的特殊寄存器以控制地址如何被轉換為物理存儲器位置。對于在這樣的機器上工作的指針,它們必須包含更多信息,而不僅僅是一個簡單的地址。因此,C標準不僅將指針定義為地址,而且讓您使用它們進行算術運算。
即使在現代機器上,也可能會出現并發(fā)癥。在Digital的Alpha處理器上,指向函數的指針不包含函數的地址。它是函數描述符的地址。該描述符包含函數的地址,它包含正確調用函數所需的一些附加信息。
關于關系運算符,例如>
,C標準在6.5.8第5段中說,你可以比較你可以減去的相同指針,如上所述,你也可以比較指向聚合對象成員的指針(a結構或聯(lián)合)。指向數組成員(或其結束地址)的指針以預期方式進行比較:指向較高索引元素的指針大于指向較低索引元素的指針。指向同一聯(lián)盟的兩個成員的指針比較相等。對于指向結構的兩個成員的指針,指向稍后聲明的成員的指針大于指向先前聲明的成員的指針。
只要您保持在上述約束之內,那么您可以將指針視為數字,即內存地址。
通常,C實現很容易提供C標準所需的行為。即使計算機具有復合指針方案(例如基址和偏移量),通常數組的所有元素都將使用相同的基址,并且結構的所有元素將使用相同的基址。因此編譯器可以簡單地減去或比較指針的偏移部分,以獲得所需的差異或比較。
但是,如果在這樣的計算機上減去指向不同數組的指針,則會得到奇怪的結果。由基址和偏移形成的位模式可能比另一個指針看起來更大(當被解釋為單個整數時),即使它指向存儲器中的較低地址。這是您必須遵守C標準規(guī)定的一個原因。

TA貢獻1875條經驗 獲得超5個贊
減去兩個指針地址會返回該類型的元素數。
因此,如果你有一個整數數組和兩個指針,減去這些指針將返回之間的int值,而不是字節(jié)數。與char類型相同。因此,您需要小心這一點,特別是如果您使用字節(jié)緩沖區(qū)或寬字符,表達式正在計算正確的值。如果您需要基于字節(jié)的緩沖區(qū)偏移來處理不使用單個字節(jié)進行存儲的內容(int,short等),則需要先將指針轉換為char *。
- 3 回答
- 0 關注
- 529 瀏覽
添加回答
舉報