2017-05-05 52 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我从来没有想过为此使用电子表格 –