增加解除引用的指针

时间:2017-05-05 02:38:32

标签: c pointers

为什么以下作品

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保持不变,但我不知道如何解释它。

2 个答案:

答案 0 :(得分:1)

数组下标运算符[]的优先级高于preincrement运算符++。所以表达是有效的:

++((*ptr)[2])

至于存储增量的位置,数组arr是一个指针数组,每个指针都指向一个字符串文字。当您递增(*ptr)[2]时,此指针的值增加1,因此它指向字符串文字中的下一个字符。

答案 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" 。现在,将其应用于其他电话。