第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C / C ++:指針算術

C / C ++:指針算術

C++ C
炎炎設計 2019-07-30 17:11:51
C / C ++:指針算術我正在閱讀Pointer Arithmetic中的一些內容,我遇到了兩件我無法理解的事情,也不知道它的用途address_expression - address_expression并且address_expression > address_expression有人可以向我解釋一下,它們是如何工作的以及何時使用它們。編輯:我想說的是,如果我只取兩個地址并減去它們,它們會產生什么如果我拿兩個地址并比較它們的結果或基于的比較編輯:我現在明白了減去地址的結果,但比較地址我仍然沒有得到它。我理解1 <2,但是地址如何比另一個更大,他們在比較什么
查看完整描述

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


查看完整回答
反對 回復 2019-07-30
?
慕容708150

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ī)定的一個原因。


查看完整回答
反對 回復 2019-07-30
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

減去兩個指針地址會返回該類型的元素數。

因此,如果你有一個整數數組和兩個指針,減去這些指針將返回之間的int值,而不是字節(jié)數。與char類型相同。因此,您需要小心這一點,特別是如果您使用字節(jié)緩沖區(qū)或寬字符,表達式正在計算正確的值。如果您需要基于字節(jié)的緩沖區(qū)偏移來處理不使用單個字節(jié)進行存儲的內容(int,short等),則需要先將指針轉換為char *。


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 529 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號