簡體   English   中英

打印C中二維數組第一個元素的地址

[英]Printing the address of the first element of 2D array in C

#include <stdio.h>

int main ()  
{
    int  arr[4][5] = {{1, 2, 3, 4, 5},
                      {6, 7,8, 9, 10},
                      {11, 12, 13, 14, 15},
                      {16, 17,18, 19, 20}
                     };
    printf("%p\n", arr);
    printf("%p\n",*arr);

    return(0);
}

我的疑問是,當我打印 arr 和 *arr 時,它打印的值相同。 為什么會這樣?

arrint的 arrays 的數組。 按照數組到指針的轉換規則, arr in printf(“%p\n”, arr); 將衰減為指向其第一個元素的指針。 數組arr的第一個元素是int [5]類型,即 5 個int的數組。 因此,它將打印數組arr的第一個元素的地址( arr[0]的地址)。

取消引用, arr將返回arr的第一個元素。 如前所述,第一個元素是int [5]類型。 所以*arr將返回一個 5 int的數組,但再次根據數組到指針的轉換規則*arr將衰減到指向它的第一個元素的指針,即arr[0][0]

因此,實際上首先printf正在打印數組arr[0]的地址,而稍后打印元素arr[0][0]的地址。

要了解為什么這兩個地址相同,我建議您閱讀這篇文章

printf("%p\n", arr);
printf("%p\n",*arr);

在第一個示例中, arr衰減為指向二維數組arr的第一個元素的指針(5 個元素的第一個int數組 - 類型( int[5] )),該指針也衰減為指向它的指針第一個元素是a[0][0]

在第二個示例中,您顯式處理了第一個維度的第一個元素(其類型為int[5] - 5 個元素的int數組),並且該元素還衰減為指向其第一個元素的指針,該指針再次a[0][0]

所以兩者都有完全相同的結果 - 訪問並打印arr - arr[0][0]的第一個維度的第一個數組的第一個元素的地址。


請注意,您需要將指針轉換為void ,以使程序符合 C 標准,因為標准意味着%p格式說明符需要具有void*類型的關聯參數:

printf("%p\n", (void*) arr);
printf("%p\n", (void*) *arr);

引自 ISO:IEC 9899:2018 (C18),第 7.21.6.1/8 節:

“p -參數應該是指向 void 的指針。指針的值以實現定義的方式轉換為打印字符序列。”

因為你應該知道任何數組的名稱都意味着這個數組的第一個地址說

 int arr[4]; 
printf("%p",arr);// the same as printf("%p",&arr[0]); 

對於二維數組,數組的名稱也充當視覺指針,指向數組中第一個元素的地址

int arr[4][5]; 
printf("%p",&arr[0][0]);//the same as printf("%p",arr);=printf("%p"*arr);
```````````````

暫無
暫無

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

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