[英]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
现在指向4
个int
指针的未初始化数组。
*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.