Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_Pointers - Fatal编程技术网

C 输出说明:一个复杂的指针算法

C 输出说明:一个复杂的指针算法,c,pointers,C,Pointers,我一直在努力理解这个程序的输出: #include <stdio.h> int main(){ static int arr[] = {0, 1, 2, 3, 4}; int *p[] = {arr, arr+1, arr+2, arr+3, arr+4}; int **ptr = p; ptr++; printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr); *ptr++; print

我一直在努力理解这个程序的输出:

#include <stdio.h>    
int main(){
    static int arr[] = {0, 1, 2, 3, 4};
    int *p[] = {arr, arr+1, arr+2, arr+3, arr+4};
    int **ptr = p;

    ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *++ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    ++*ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);    

    return 0;
}

有人能解释一下输出吗?

您可能需要阅读中的6.5.6

基本上,对于指针之间的差异

  • 它们必须指向同一个数组(或超过末端的一个数组)
  • 区别在于分隔指针的元素数(或字节数除以每个元素的大小,以字节为单位)

  • 您可能需要阅读中的6.5.6

    基本上,对于指针之间的差异

  • 它们必须指向同一个数组(或超过末端的一个数组)
  • 区别在于分隔指针的元素数(或字节数除以每个元素的大小,以字节为单位)

  • 我将尝试仅解释第一个
    printf
    。我认为理解printfs的其余部分就足够了。正如其他人所注意到的,该代码是基于在C语言中使用指针算法编写的

    arr
    数组包含从0到4的五个数字。
    p
    是指向整数的指针数组,它由存储在
    arr
    中的数字的“地址”填充。
    ptr
    是指向整数的指针,它用
    p
    初始化(因为在C语言中指针数组相当于指向指针的指针)

    然后,
    ptr
    递增。请记住,我们正在递增地址,因此现在它指向
    p
    数组中的
    (arr+1)
    元素。 这就是为什么
    ptr-p
    返回1。换句话说,我们在减去地址

    *ptr
    指向
    arr+1
    元素。这就是为什么第二个值也等于1


    通过执行
    **ptr
    我们检索存储在
    arr+1
    地址的值,它也是1。

    我将尝试仅解释第一个
    printf
    。我认为理解printfs的其余部分就足够了。正如其他人所注意到的,该代码是基于在C语言中使用指针算法编写的

    arr
    数组包含从0到4的五个数字。
    p
    是指向整数的指针数组,它由存储在
    arr
    中的数字的“地址”填充。
    ptr
    是指向整数的指针,它用
    p
    初始化(因为在C语言中指针数组相当于指向指针的指针)

    然后,
    ptr
    递增。请记住,我们正在递增地址,因此现在它指向
    p
    数组中的
    (arr+1)
    元素。 这就是为什么
    ptr-p
    返回1。换句话说,我们在减去地址

    *ptr
    指向
    arr+1
    元素。这就是为什么第二个值也等于1

    通过执行
    **ptr
    我们检索存储在
    arr+1
    地址的值,它也是1。

    在第一次ptr++之后,它将是: 因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:1

    *ptr++之后将是: 因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:2

    *++ptr之后,它将是:

    因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:3

    ++*ptr之后,它将是:

    因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:3 4

    希望能有所帮助。

    在第一次ptr++之后,它将是: 因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:1

    *ptr++之后将是: 因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:2

    *++ptr之后,它将是:

    因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:3

    ++*ptr之后,它将是:

    因此,
    printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)将给出:3 4


    希望它有帮助。

    主要考虑的是指针上的算术运算。 执行以下操作(即地址所指数据的数据类型大小)

    add+1=add+1*)


    代码> ++< /代码>和<>代码> >。

    主要考虑的是指针上的算术运算。 执行以下操作(即地址所指数据的数据类型大小)

    add+1=add+1*)


    ++
    --
    也是这样。

    在什么情况下你会“遇到”这样的事情?这对我来说似乎是做作的、令人讨厌的、毫无意义的。@放松:我同意,这也似乎是做作的、令人讨厌的、毫无意义的,但这是从我的问题纸上抄来的。相似的问题:相似的:你在什么情况下“遇到”这样的事情?这对我来说似乎是做作的、令人讨厌的、毫无意义的。@放松:我同意,这也似乎是做作的、令人讨厌的、毫无意义的,但这是从我的问题纸上抄来的。类似的问题:类似的:Ptr指向p[1],p是p[0]。因此,差异1。这是指针的差异,希望能有所帮助。Ptr指向p[1],p是p[0]。因此,差异1。这是指针的区别,希望能有所帮助。
    1 1 1
    2 2 2
    3 3 3
    3 4 4