如何证明一个指向指针字符数组程序的指针的输出

How to Justify the Output of a Pointer To Pointer char array Program

#include <stdio.h>
#define STOP 0
void function(char**);
int main() {
    char*arr[] = { "icsp","hw6","fall","spring","autumn","winter" };
    function(arr);
    return 0;
}
void function(char**ptr) {
    char*ptr1;
    ptr1 = (ptr += sizeof(int))[-2];
    printf("%s\n", ptr1);
}

我有这段代码作为我的作业来解释它是如何工作的works.I不知道这个指向指针数组的指针是如何工作的以及这一行是做什么的ptr1 = (ptr += sizeof(int))[-2];? 输出是

fall

如果你解释一下,我将不胜感激。

arrchar 个指针的数组。

arr
----
|  |->"icsp"
----
|  |->"hw6"
----
|  |->"fall"
----
|  |->"spring"
----
|  |->"autumn"
----
|  |->"winter"
----

当调用 function() 函数并传递 arr 参数时,函数参数 ptr 将指向数组 arr.

ptr-+
    |
   ----
   |  |->"icsp"
   ----
   |  |->"hw6"
   ----
   |  |->"fall"
   ----
   |  |->"spring"
   ----
   |  |->"autumn"
   ----
   |  |->"winter"
   ----

让我们解码这个语句

ptr1 = (ptr += sizeof(int))[-2];

假设在你的平台上sizeof(int)4字节,那么这个

ptr += sizeof(int)  =>  ptr += 4 

将使 ptr 指向字符串 "autumn".

       ----
       |  |->"icsp"
       ----
       |  |->"hw6"
       ----
       |  |->"fall"
       ----
       |  |->"spring"
       ----
ptr--> |  |->"autumn"
       ----
       |  |->"winter"
       ----

现在,-2 下标应用于结果指针时,即 ptr[-2] 将给出当前元素的 2 索引之前的元素,即指向字符串 fall 的指针。它将分配给 ptr1。打印 ptr1 给出输出 fall.

在函数 function 中,指针 ptr 指向数组的第一个元素 arr 由于最后一个用作函数调用参数的隐式转换

function(arr);

在这个表达式中

ptr += sizeof(int)

这里用到了指针运算。如果假设 sizeof( int ) 等于 4 那么上面的表达式等价于

ptr += 4

现在指针 ptr 指向数组的第五个元素 arr,其中包含指向字符串文字 "autumn".

的指针

然后就是用到了下标运算符

ptr1 = (ptr += sizeof(int))[-2];

表达式

(ptr += sizeof(int))[-2]

等同于

*( (ptr += sizeof(int)) -2 )

也就是指针表达式

(ptr += sizeof(int)) -2

现在指向数组的第三个元素,即指向 "fall" 的元素(字符串文字)(指针向左移动两个位置)

取消引用指针

ptr1 = *( (ptr += sizeof(int)) -2 )

你得到一个指针,指向在这个调用中输出的字符串文字的第一个字符

printf("%s\n", ptr1);