需要帮助来理解c中的指针和数组的代码

我需要了解注释行的作用吗?

#include  void fun(char**); int main() { char *argv[] = {"ab", "cd", "ef", "gh"}; fun(argv); return 0; } void fun(char **p) { char *t; t = (p+= sizeof(int))[-1]; //what this line does? //[-1] does what? printf("%s\n", t); } 

假设你的机器中的int是4个字节,那么用4替换sizeof(int)

 t = (p+= 4))[-1]; 

只是向前移动指针p 4个元素,并向后移动1个元素,然后获取元素。

在这个例子中,数组有4个元素,所以向前移动到一个结尾,然后向后移动到最后一个元素,即"gh"

几点说明:

  • a[-1]只是*(a - 1)
  • 你需要确保在进行指针运算时,它们总是将一个元素指向一个数组或一个结束。
  • 名称argv也不是一个好主意,因为我们通常用它来引用main的参数。

-1只表示它转到上一个项目:

 x[-1]=*(x-1) 

整条线是

 *(x+sizeof(int)-1) 

sizeof(int)可能是4,因此该行等于:

 *(x+4-1)=*(x+3)=x[3]="gh" 

初始**p包含argv[0]元素的地址,即"ab"然后递增2 (以2个字节给出的int的大小)。现在它指向"ef"然后递减-1 .so最后指向"cd"所以它将t值打印为"cd"

注意:

由于C是机器相关语言sizeof(int)可能返回不同的值。

上述程序的输出将是Windows(Turbo C)中的cd和Linux(GCC)中的gh。

要更好地理解它,请在Windows(使用Turbo C编译器)和Linux(GCC编译器)中编译和执行上述程序。