簡體   English   中英

將指針元素分配給數組中另一個指針元素是什么意思?

[英]What does assignment of a pointer element to another pointer element in the array mean?

我不太了解將一個指針分配給另一個指針是什么意思? 這里** p是一個指針數組/ 2D數組,然后將p [0]分配給p [1],它們兩個都指向同一個地址嗎?

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int i,j;
    int **p = (int **)malloc(2 * sizeof(int *));
    p[0] = (int *)malloc(2 * sizeof(int));
    p[1] = p[0];
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            p[i][j] = i + j;
    printf("%d",p[0][0]);
    return 0;
}

我期望輸出為0,但實際上為1,為什么?

在表達式語句之后,兩個指針p[0]p[1]具有相同的值

p[1] = p[0];

因此,在使用表達式p[1]情況下,可以將其替換為表達式p[0]因為這兩個表達式的值相同,反之亦然。

在這個循環中

for(i = 0; i < 2; i++)
    for(j = 0; j < 2; j++)
        p[i][j] = i + j;

i等於1j等於0 (假定p[1]p[0]相同) p[1][0]等於p[0][0]等於i + j1

實際上這個循環

for (i = 0; i < 2; i++)
    for (j = 0; j < 2; j++)
        p[i][j] = i + j;

相當於循環

for (i = 0; i < 2; i++)
    for (j = 0; j < 2; j++)
        p[0][j] = i + j;

因此,外循環的第二次迭代將在第一次迭代之后重寫存儲在p[0][0]p[0][1]的值。

在第二次迭代中,我們有i等於1 因此,對於[0,1]范圍內的j ,我們有

p[0][0] = i + j (when i == 1 and j == 0 ) = 1

p[0][1] = i + j (when i == 1 and j == 1 ) = 2

我不太了解將一個指針分配給另一個指針是什么意思? 這里** p是一個指針數組/ 2D數組,然后將p [0]分配給p [1],它們兩個都指向同一個地址嗎?

是。 但是,從概念上講,忽略p[0]p[1]的值的重要性 (這些值是指針,以及這些值指向的對象)可能更有用,而不是關注分配后,它們的值是相同的。 然后,這些值指向同一件事。

請注意,我故意選擇措辭,以區分存儲位置的指示符(例如“ p[1] ”)和這些位置的內容 (即它們的值)。 我們經常使用模糊區分的語言,因為以這種方式精確地講會很麻煩,但保持頭腦中的區分至關重要。 從形式上說,不是表達式 p[1]甚至不是它指定的存儲位置都是指針,而是存儲在那里的值。 賦值運算符將該值復制到另一個存儲位置,因此,自然地,如果該另一個存儲位置的內容是根據相同的數據類型解釋的,則它們的含義與原始含義相同。

我期望輸出為0,但實際上為1,為什么?

因為在設置p[1] = p[0] ,表達式p[1][0]指定的對象與p[0][0] 分配p[1][0] = 1 + 0 ,可以從p[1][0]p[0][0]讀取結果值(1)。

他們兩個都指向同一個地址嗎?

是。

這是您的程序的修改,應使其更加清晰:

int main(void) {
    int i,j;
    int **p = (int **)malloc(2 * sizeof(int *));
    p[0] = (int *)malloc(2 * sizeof(int));
    p[1] = p[0];
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            p[i][j] = i + j;
    for(i = 0; i < 2; i++) {
        printf("%d (%p)\t", i, p[i]);
        for(j = 0; j < 2; j++)
            printf("%d ", p[i][j]);
        printf("\n");
    }
    return 0;
}

在這里,我們打印出指針值p[0]p[1]以及“二維”數組的所有四個單元格–只是,確實只有兩個單元格,對每個單元格執行雙重任務兩行。 在我的系統上,此打印

0 (0x7f92ca402710)  1 2 
1 (0x7f92ca402710)  1 2 

您可以清楚地看到兩個指針是相同的。

我們可以在內存中將其視為如下所示:

   +-------+
p: |   *   |
   +---|---+
       |
       v
   +-------+           +---+---+
   |   *----------+--->| 1 | 2 |
   +-------+     /     +---+---+
   |   *--------'
   +-------+

另一方面,如果您多次調用malloc而不是兩次,則如下所示:

    int **p = (int **)malloc(2 * sizeof(int *));
    p[0] = (int *)malloc(2 * sizeof(int));
    p[1] = (int *)malloc(2 * sizeof(int));

您將獲得如下打印輸出:

0 (0x7fb747402710)  0 1 
1 (0x7fb747402720)  1 2 

然后您將在內存中獲得如下圖像:

   +-------+
p: |   *   |
   +---|---+
       |
       v
   +-------+           +---+---+
   |   *-------------->| 0 | 1 |
   +-------+           +---+---+
   |   *--------.
   +-------+     \     +---+---+
                  '--->| 1 | 2 |
                       +---+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM