Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助来理解c中指针和数组的代码吗_C_Arrays_Pointers - Fatal编程技术网

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

需要帮助来理解c中指针和数组的代码吗,c,arrays,pointers,C,Arrays,Pointers,我需要了解注释行的作用是什么 #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 wh

我需要了解注释行的作用是什么

#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);
}
#包括
虚无乐趣(char**);
int main()
{
char*argv[]={“ab”、“cd”、“ef”、“gh”};
乐趣(argv);
返回0;
}
虚无乐趣(字符**p)
{
char*t;
t=(p+=sizeof(int))[-1];//这行做什么?//[-1]做什么?
printf(“%s\n”,t);
}

-1
仅表示它转到上一项:

x[-1]=*(x-1)
整条线都是

*(x+sizeof(int)-1)
sizeof(int)可能为4,因此该行等于:

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

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

t = (p+= 4))[-1];
只需向前移动指针
p
4个元素,向后移动1个元素,然后获取元素

在本例中,数组有4个元素,因此向前移动到结束后的一个元素,然后向后移动到最后一个元素,即
“gh”

几点注意:

  • a[-1]
    只是
    *(a-1)
  • 您需要确保在执行指针算术时,指针始终指向数组中的一个元素或超出数组末尾的一个元素
  • 此外,名称
    argv
    也不是一个好主意,因为我们通常使用它来 请参阅
    main
    的参数

最初
**p
包含
argv[0]
元素的地址,即
“ab”
。然后将其递增
2
(int的大小以2字节表示)。现在它指向
“ef”
。然后将其递减为
-1
。因此最后指向
“cd”
。因此它将
t
的值打印为
“cd”

注意:

由于C是一种依赖于机器的语言,sizeof(int)可能返回 不同的价值观

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

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


有人已经给出了答案,但我敢肯定这是一个家庭作业问题,从长远来看,在你的计算机上运行这些代码会更好。如果您运行它,您将能够准确地看到该行正在执行的操作。@lxt:我已经运行了它,并将输出视为
gh
,这对我来说很奇怪。这就是为什么我要求理解代码,而不是告诉输出。