C 解引用指针增量

C 解引用指针增量,c,pointers,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 a 我搞不清楚取消引用的ptr增加的信息为什么会保留在哪里。调试器告诉我,(*ptr)[2]确实是递增的,ptr保持不变,但我不知道如何解释它。

为什么下面的文章

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
a


我搞不清楚取消引用的
ptr
增加的信息为什么会保留在哪里。调试器告诉我,
(*ptr)[2]
确实是递增的,
ptr
保持不变,但我不知道如何解释它。

数组下标运算符
[]
的优先级高于预递增运算符
++
。因此,这个表达式实际上是:

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

Ptr
是指向数组的指针
&a
指向整个数组的地址,所以当您执行
&a+1
操作时,数组的整个大小将增加。
现在,当我们执行
*ptr
时,它意味着现在它指向数组的第一个元素,即ptr包含数组的第一个元素的地址,即1000。
现在,[]运算符将地址增加到该位置,因此
(*ptr)[2]
相当于1000+2(指针添加),即1008。

现在我们在1008位置,应用
++
,这将作用于其包含地址300的内存,将变为301(因为
JAVA
是字符串,字符串中的每个元素在内存中占用1字节空间,所以字符指针仅递增1字节),所以它打印“ava”。现在,对其他调用应用相同的方法。

arr[2]
是递增的。请您在声明中添加更多的专利论文和
*
s,使您的代码更加复杂?为什么不
char**ptr=arr并在
printf
s中使用更简单的表达式?你想得到什么?预期的结果是什么?调试器显示了有关阵列的哪些信息?