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]);
输出
avava
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中使用更简单的表达式?你想得到什么?预期的结果是什么?调试器显示了有关阵列的哪些信息?