簡體   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