C 指针间接混淆

C 指针间接混淆,c,C,我有一个数组: int x[3][5]={ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} }; *x指的是什么 *(*x+2)+5指的是“8”。这是如何发生的 *(*x+2)与*(*x)+2相同吗 如果我做了: *n=&x; 指针n指向哪里?如果它只有x而不是an&那么它就是基址。现在呢 *x表示第一个数组({1,2,3,4,5}),它等价于x[0]。将一个添加到x将移动到下一个数组,这样

我有一个数组:

int x[3][5]={
        {1,2,3,4,5},
        {6,7,8,9,10},
        {11,12,13,14,15}
        };
  • *x指的是什么
  • *(*x+2)+5指的是“8”。这是如何发生的
  • *(*x+2)与*(*x)+2相同吗
  • 如果我做了:

    *n=&x; 指针n指向哪里?如果它只有x而不是an&那么它就是基址。现在呢


  • *x
    表示第一个数组({1,2,3,4,5}),它等价于x[0]。将一个添加到
    x
    将移动到下一个数组,这样
    *(x+1)
    将引用第二个数组,并将等效于x[1]

    *(*x+2)
    因此是第一个数组中的第三个元素,即3。这意味着
    *(*x+2)+5
    等于8

    括号很重要,例如,
    *(*(x+2))
    将是第三个数组中的第一个元素


    *(*x+2)
    产生与
    *(*x)+2
    相同的值,但不使用数组的相同元素

    *x
    表示第一个数组({1,2,3,4,5}),它等价于x[0]。将一个添加到
    x
    将移动到下一个数组,这样
    *(x+1)
    将引用第二个数组,并将等效于x[1]

    *(*x+2)
    因此是第一个数组中的第三个元素,即3。这意味着
    *(*x+2)+5
    等于8

    括号很重要,例如,
    *(*(x+2))
    将是第三个数组中的第一个元素


    *(*x+2)
    产生与
    *(*x)+2
    相同的值,但不使用数组的相同元素

    x是一个
    int**
    ,所以这就像你有一个第一层的指针,每个指针都指向一个
    int*
    (也就是一个
    int
    数组)

    写入
    *x
    时,将获得包含指向多维数组第一行的地址的地址


    因此,如果您采用
    (*x+2)
    ,就像引用数组的第一行,然后将2添加到地址:您将获得第一行的第三个元素的地址。但由于这仍然是一个指针,您添加了一个外部的
    *(*x+2)
    ,以精确地获得第一行的第三个元素。

    x是一个
    int**
    ,所以这就像您有一个第一层指针,并且每个指针都指向
    int*
    (因此是一个
    int
    数组)

    写入
    *x
    时,将获得包含指向多维数组第一行的地址的地址

    因此,如果您采用
    (*x+2)
    ,就像引用数组的第一行,然后将2添加到地址:您将获得第一行的第三个元素的地址。但由于这仍然是一个指针,所以您添加了一个外部
    *(*x+2)
    ,以精确地获得第一行的第三个元素

  • *x
    是一种解引用操作。换句话说,“给我
    x
    指的是什么”。由于这是一个数组(由数组组成),取消引用x将得到第一个数组。这相当于
    x[0]
    的数组访问语法

  • *(*x+2)+5
    相当于
    x[0][2]+5
    ,这将为您提供8。这是因为:
    *x
    x[0]
    (参见#1)相同,
    *(x+2)
    x[2]
    相同。完成两次解引用后,就从数组数组(类似于双指针)变为数组(单指针)再变为实际数(第一个数组中的第三项)。那么,它只是3+5=8

  • *(*x+2)
    相当于
    x[0][2]
    (参见#2),即3(数组中的第三个元素)。但是,
    *(*x)+2
    为您提供
    x[0][0]+2
    (数组中的第一个元素加上2),即1+2=3。答案是一样的,但得到答案的方式却大不相同

  • *x
    是一种解引用操作。换句话说,“给我
    x
    指的是什么”。由于这是一个数组(由数组组成),取消引用x将得到第一个数组。这相当于
    x[0]
    的数组访问语法

  • *(*x+2)+5
    相当于
    x[0][2]+5
    ,这将为您提供8。这是因为:
    *x
    x[0]
    (参见#1)相同,
    *(x+2)
    x[2]
    相同。完成两次解引用后,就从数组数组(类似于双指针)变为数组(单指针)再变为实际数(第一个数组中的第三项)。那么,它只是3+5=8

  • *(*x+2)
    相当于
    x[0][2]
    (参见#2),即3(数组中的第三个元素)。但是,
    *(*x)+2
    为您提供
    x[0][0]+2
    (数组中的第一个元素加上2),即1+2=3。答案是一样的,但得到答案的方式却大不相同

  • 这样想:

    typedef int Int5[5];
    Int5 x[3];
    
    x
    是一个包含3个元素的数组。这三个元素中的每一个都是5整数的数组

    • *x指的是什么
    x
    与'&x[0]
    相同,因此
    *x
    与第一个5元素数组
    x[0]`相同

    • *(*x+2)+5指“8”。这是怎么发生的
    *x
    是x[0],而
    x+2
    &x[2]
    所以
    *x+2
    &x[0][2]
    *(*x+2)
    x[0][2]
    ,正好是3。再加上五个,八个

    • *(*x+2)与*(*x)+2相同吗
    *(*x+2)
    正如我们所看到的那样是
    x[0][2]
    *(*x)
    将是x[0][0],因此
    *(*x)+2
    x[0][0]+2
    。所以
    *(*x+2)
    *(*x)+2
    最终都等于3,但这只是巧合。

    这样想:

    typedef int Int5[5];
    Int5 x[3];
    
    x
    是一个包含3个元素的数组。这三个元素中的每一个都是5整数的数组

    • *x指的是什么
    x<