繁体   English   中英

我很困惑如何理解此代码。 包含双指针

[英]I am confused how to understand this code. contains double pointers

我不明白为什么下面的代码更改数组b

int a[] = { 3, 6, 9 };
int b[] = { 2, 4, 6, 8, 10 };
int **c;
int **d[2];
c = (int **)malloc (b[1] * sizeof(int *));
*c = &a[1];
c[1] = c[0] + 1;
*d = c;
c = c + 2;
*c = b;
c[1] = &c[0][3];
*(d + 1) = c;
d[0][3][1] = d[1][0][0];
d[1][0][2] = d[0][1][0];

我已经运行了这段代码,并找到了数组a和数组b的值,但是我无法理解这些值是如何来的。

阵列a而保持不变b变为2, 4, 9, 8, 2 这是怎么发生的?

c = (int**)malloc(b[1] * sizeof(int*));  //int **c[4] ???

c是双指针数组*c = &a[1]这意味着c[0]具有数组a的第二个索引的地址。 我没有办法解释这一点。

该代码包含实际语句,因此它必须是函数主体的一部分,因此此处的所有声明都具有自动存储功能。 它是高度复杂的,具有故意制造的双重间接...让我们一次对其进行分析:

  • int a[] = { 3, 6, 9 }; - a是与一些明确的值进行初始化3个整数的数组。

  • int b[] = { 2, 4, 6, 8, 10 }; -同样, b是由3个int组成的数组,这些数组用一些显式值初始化。

  • int **c; c是指向int的指针的未初始化指针,可以使它指向指向int的指针数组。

  • int **d[2]; - d为2点的指针的未初始化数组的指针,以int ,其中的每一个可以由指向指针的数组int

  • c = (int **)malloc(b[1] * sizeof(int *)); c设置为指向未初始化的内存块,其大小为4指向int指针。 简而言之, c现在指向4int指针的未初始化数组。

  • *c = &a[1]; -由c (aka A[0] )指向的元素设置为指向a (aka a[1]的第二个元素,值为6 )。 A[0]值为&a[1]

  • c[1] = c[0] + 1; -由c (aka A[1] )指向数组中的第二个元素被设置为指向c[0]指向的元素之后的元素,因此它指向a (aka a[2]的值为9 )。 A[1] is &a [2]`。

  • *d = c; d的第一个元素设置为指针c的值,该值是A[0]的地址。 d[0]值为&A[0]

  • c = c + 2; -指针c递增2 ,现在指向分配有malloc() A[2]的数组A的第三个元素。

  • *c = b; -由c指向的元素A[2] (本身就是一个指针)被设置为指向b的第一个元素b[0] A[2]值为&b[0]

  • c[1] = &c[0][3]; -之后,由malloc分配的数组的第4个元素A [3]设置为指向c指向的数组的第4个元素。 &c[0][3]等效于c[0] + 3&(*c)[3]或简单地*c + 3 该元素是b[3] ,其值为8 A[3] is &b [3]`。

  • *(d + 1) = c; -这等效于d[1] = c; 它将d的第二个元素设置为指针c的值,该指针c是通过malloc()分配的数组第三个元素的地址A[2] ,它指向b[0] d[1]值为&A[2]

  • d[0][3][1] = d[1][0][0]; -让我们重写以下术语:

    • d[0][3][1] =>(&A [0])[3] [1] => A[3][1] => (&b[3])[1] => *((b + 3) + 1) => b[4]

    • d[1][0][0] => (&A[2])[0][0] => (*&A[2])[0] => A[2][0] => (&b[0])[0] => b[0] ,即值2

    • 因此b[4] = 2;

  • d[1][0][2] = d[0][1][0]; -让我们重写一下:

    • d[1][0][2] => (&A[2])[0][2] => (*&A[2])[2] => A[2][2] => (&b[0])[2] => (b + 0)[2] => b[2]
    • d[0][1][0] => (&A[0])[1][0] ,即A[1][0] => (&a[2])[0] => *&a[2] => a[2]的值为9
    • 因此b[2] = 9;

结果,数组b现在具有元素{ 2, 4, 9, 8, 2 }

您可以运行该程序:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a[] = { 3, 6, 9 };
    int b[] = { 2, 4, 6, 8, 10 };
    int **c;
    int **d[2];
    c = (int **)malloc (b[1] * sizeof(int *));
    *c = &a[1];
    c[1] = c[0] + 1;
    *d = c;
    c = c + 2;
    *c = b;
    c[1] = &c[0][3];
    *(d + 1) = c;
    d[0][3][1] = d[1][0][0];
    d[1][0][2] = d[0][1][0];

    printf("a = { ");
    for (size_t i = 0; i < sizeof a / sizeof *a; i++)
        printf("%d, ", a[i]);
    printf("};\n");

    printf("b = { ");
    for (size_t i = 0; i < sizeof b / sizeof *b; i++)
        printf("%d, ", b[i]);
    printf("};\n");

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM