2011-08-18 64 views
10

我知道這已被散列了很多時間,但今天我遇到了一個案例,它震撼了我對指針數學/數組索引的理解。指針數學與數組索引

正如我總是明白它,& mybuff [10]和(& mybuff + 10)是referancing相同的內存equivilent方式。

不過,我花了一上午的戰鬥,其中一個案例:當與優化的編譯工作只是罰款編譯調試時,

memcpy(&mybuff+10,&in,8); 

溢出的緩衝區。

雖然athe同時,

memcpy(&mybuff[10],&in,8); 

在這兩種情況下工作得很好。

非常感謝任何想法或指針。

+10

三通熙詢問「指針」 – Daniel

+9

[某些指針(http://xkcd.com/138/)。 – mopsled

+1

'&mybuff [10]'計算結果爲'&(*(mybuff + 10))',它是從'&mybuff + 10'不同。請記住像'[]'這樣的後綴運算符比像'&'這樣的一元運算符具有更高的優先級。的 –

回答

1

正確的語法是mybuff+10&mybuff+10它說移動到在陣列中放置10位並複製8個字節(每個你r memcpy語句)。不過,您是否實際上可以額外保留8個字節仍是未知數。

+0

正確的sytax爲什麼? – user12861

+0

@ user12861:去這裏 - http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/ – 2011-08-18 21:07:25

+0

我說這個答案是不明確的。就我個人而言,我知道至少有這麼多的C++。 – user12861

2

我認爲你有一些指針問題。
如果mybuff是一個指針,那麼mybuff + 10 == &(mybuff[10])
這和&mybuff + 10不一樣,就像你在那裏一樣。

6

我發明爲mybuff聲明爲舉例起見:

char mybuff[123]; 

現在,&mybuff+10確實指針上&mybuff arithmic,其具有類型「指針的123個字符陣列」。這是不同從普通mybuff(指針衰減後)有類型「指向char」指針。這兩個表達式的位值是相同的,但由於它們是指向不同大小事物的指針,它們在指針運算下的行爲不同。

&mybuff+10意味着你想一步過去的類型123字符數組(這是沒有意義的,因爲宣言,並可能出現段錯誤)十,而mybuff+10只是說,你想一步過去十年個別字符。

2

(&mybuff+10)&mybuff[10]是等價,但&mybuff[10]mybuff + 10是。

+0

不完全; '&mybuff [10]'解析爲&&(mybuff [10])',它被評估爲'&(*(mybuff + 10))'。 –

+0

這相當於'mybuff + 10'。 –

+0

只是刪除或編輯我們的答案的第一行,因爲它對初學者不明確 – xitx

4

&mybuff[10]相當於&mybuff[0] + 10這相當於mybuff + 10

數組索引在指針運算來定義的。 p[i]意味着*(p+i)(我忽略了在需要額外括號的情況下pi是一個更復雜的表達式),其中p是一個指針值,i是一個整數值。

瑣事:既然加法,即使是指針+整數加法,也是可交換的,p[i]也可以寫成i[p]。是的,4["Hello"] == 'o'。爲了將來任何人閱讀你的代碼,請做而不是利用這些知識。

有關C(和C++中的規則幾乎相同)中數組和指針之間關係的極好參考是comp.lang.c FAQ的第6部分。 (我可以直接鏈接到第6,但我喜歡鼓勵人們瀏覽它,整個事情是值得一讀。)