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

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

通過下標(biāo)獲取一個過端數(shù)組元素的地址:C+標(biāo)準(zhǔn)是否合法?

通過下標(biāo)獲取一個過端數(shù)組元素的地址:C+標(biāo)準(zhǔn)是否合法?

C++ C
森林海 2019-06-29 10:08:50
通過下標(biāo)獲取一個過端數(shù)組元素的地址:C+標(biāo)準(zhǔn)是否合法?我已經(jīng)多次看到它斷言C+標(biāo)準(zhǔn)不允許使用以下代碼:int array[5];int *array_begin = &array[0];int *array_end = &array[5];是&array[5]這種情況下的C+代碼合法嗎?如果可能的話,我想要一個參考標(biāo)準(zhǔn)的答案。知道它是否符合C標(biāo)準(zhǔn)也會很有趣。如果它不是標(biāo)準(zhǔn)的C+,為什么決定將它與array + 5或&array[4] + 1?
查看完整描述

3 回答

?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊

是的,這是合法的。從C99標(biāo)準(zhǔn)草案:

第6.5.2.1條第2款:

后綴表達(dá)式,后面是方括號中的表達(dá)式[]是數(shù)組對象的元素的訂閱指定。下標(biāo)運(yùn)算符的定義[]那是E1[E2]是相同的(*((E1)+(E2)))..因為適用于二進(jìn)制文件的轉(zhuǎn)換規(guī)則。+操作員,如果E1是數(shù)組對象(等價地,指向數(shù)組對象的初始元素的指針)E2是整數(shù),E1[E2]指定E2-第四要素E1(從零算起)。

第6.5.3.2條第3款(重點是地雷):

一元&運(yùn)算符生成其操作數(shù)的地址。如果操作數(shù)具有“類型類型‘,結(jié)果有類型’指向類型“”如果操作數(shù)是一元數(shù)據(jù)的結(jié)果*運(yùn)算符,則該運(yùn)算符和&運(yùn)算符被計算,結(jié)果就好像兩者都被省略了一樣,只是對運(yùn)算符的約束仍然適用,并且結(jié)果不是lvalue。同樣,如果操作數(shù)是[]運(yùn)算符,既不是&運(yùn)算符,也不是一元*,這是由[]值計算,結(jié)果就好像&運(yùn)算符被移除,并且[]操作符更改為+操作者..否則,結(jié)果是指向其操作數(shù)指定的對象或函數(shù)的指針。

第6.5.6條第8款:

將具有整數(shù)類型的表達(dá)式添加到指針或從指針中減去時,結(jié)果具有指針操作數(shù)的類型。如果指針操作數(shù)指向數(shù)組對象的一個元素,并且數(shù)組足夠大,則結(jié)果指向與原始元素偏移的元素,從而使結(jié)果數(shù)組元素和原始數(shù)組元素下標(biāo)的差值等于整數(shù)表達(dá)式。換句話說,如果表達(dá)式P指向i-數(shù)組對象的第四個元素,表達(dá)式(P)+N(相當(dāng)于,N+(P))和(P)-N(在哪里N有價值n)分別指向i+n-第四和i?n-數(shù)組對象的第四個元素,只要它們存在。另外,如果P指向數(shù)組對象的最后一個元素,即表達(dá)式。(P)+1指向數(shù)組對象的最后一個元素,如果表達(dá)式Q指向數(shù)組對象的最后一個元素,即表達(dá)式。(Q)-1指向數(shù)組對象的最后一個元素。如果指針操作數(shù)和結(jié)果都指向同一個數(shù)組對象的元素,或者指向數(shù)組對象的最后一個元素,則計算值不會產(chǎn)生溢出;否則,行為將未定義。如果結(jié)果指向數(shù)組對象的最后一個元素,則不應(yīng)將其用作一元的操作數(shù)。*計算的運(yùn)算符。

注意,該標(biāo)準(zhǔn)顯式地允許指針在數(shù)組結(jié)束后指向一個元素,但前提是它們不被取消引用..由6.5.2.1和6.5.3.2&array[5]等于&*(array + 5),這相當(dāng)于(array+5),它指向數(shù)組結(jié)束后的一個。這不會導(dǎo)致取消引用(6.5.3.2),因此它是合法的。


查看完整回答
反對 回復(fù) 2019-06-29
?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗 獲得超21個贊

合法的。

根據(jù)GCC編寫的C+文檔&array[5]是合法的。在C+中在C您可以安全地處理數(shù)組結(jié)束后的元素-您將得到一個有效的指針。所以&array[5]作為一種表達(dá)是合法的。

但是,嘗試取消指向未分配內(nèi)存的指針仍然是未定義的行為,即使指針指向有效地址。因此,試圖取消引用由該表達(dá)式生成的指針仍然是未定義的行為(即非法),即使指針本身是有效的。

但在實踐中,我認(rèn)為它通常不會導(dǎo)致墜機(jī)。

編輯:順便說一句,STL容器的end()迭代器通常是這樣實現(xiàn)的(作為指向一個過端的指針),所以這很好地證明了這種做法是合法的。

編輯:哦,現(xiàn)在我看到你并不是真的在問持有指向那個地址的指針是否合法,但是獲取指針的確切方式是否合法。我會聽從其他人的意見。


查看完整回答
反對 回復(fù) 2019-06-29
  • 3 回答
  • 0 關(guān)注
  • 553 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號