2

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

#include <stdio.h>
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);
}
4

3 回答 3

4

假设int您的机器中有 4 个字节,则替换sizeof(int)为 4:

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

只是将指针向前移动p4个元素,然后向后移动1个元素,然后获取元素。

在此示例中,数组有 4 个元素,因此向前移动到末尾的一个,然后向后移动到最后一个元素,即"gh".

几点注意事项:

  • a[-1]只是*(a - 1)
  • 您需要确保在进行指针运算时,它们始终指向数组中的一个元素或指向末尾的一个元素。
  • 另外这个名字argv也不是一个好主意,因为我们通常用它来指代 的参数main
于 2013-09-15T14:47:10.997 回答
1

-1只是意味着它转到上一项:

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

整条线是

*(x+sizeof(int)-1)

sizeof(int) 可能是 4 所以这条线等于:

*(x+4-1)=*(x+3)=x[3]="gh"
于 2013-09-15T14:46:27.673 回答
0

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

笔记:

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

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

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

于 2016-02-07T16:36:27.563 回答