需要帮助来理解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编译器)中编译和执行上述程序。