2017-05-05 50 views
-1

爲什麼下面這段增量復引用指針的

char *arr[] = {"C", "C++", "Java", "VBA"}; 
char *(*ptr)[4] = &arr; 
printf("%s\n", ++(*ptr)[2]); 
printf("%s\n", ++(*ptr)[2]); 
printf("%s\n", ++(*ptr)[2]); 

輸出

AVA
VA
一個

我想不通原因和位置信息保留被解引用的ptr。調試器告訴我(*ptr)[2]的確增加了,ptr保持不變,但我不知道如何解釋它。

+1

'arr [2]'是什麼增加。 – Cornstalks

+1

您能否在聲明中添加更多的專利和'*'以使您的代碼更加複雜?爲什麼不'char ** ptr = arr;'在'printf's中使用更簡單的表達式?你想要什麼?預期的結果是什麼?調試器顯示您的陣列是什麼? – Olaf

回答

1

數組下標運算符[]比預增運算符++具有更高的優先級。所以表達式實際上是:

++((*ptr)[2]) 

至於增量存儲在哪裏,你的陣列arr是一個指針數組,每個指向一個字符串。當您增加(*ptr)[2]時,此指針的值增加1,因此它指向字符串文字中的下一個字符。

1

 Memory map for understanding

 memory map of string JAVA

Ptr是一個指針數組。 &a指向整個數組的地址,所以當你做&a+1時,整個數組的大小會增加。
現在,當我們做*ptr時,這意味着它現在指向數組的第一個元素,即ptr包含數組的第一個元素的地址,即1000。
現在,[]運算符將地址遞增到那個位置,所以(*ptr)[2]等於1000 +2(指針加法),即1008。
現在我們在1008位置並應用++,所以這將作用於其包含地址300的內存,將變成301(因爲JAVA是字符串中的每個元素都佔用內存中的1個字節空間,所以字符指針會遞增1個字節),所以它打印「ava」。現在,將其應用於其他呼叫。

+0

hhhah我從來沒有想過爲此使用電子表格 –