[英]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.