2016-01-29 42 views
4

我完全不熟悉編程。此代碼不能正常工作,因爲我想,這是從2-d陣列獲取1-d陣列地址:我可以從二維數組中檢索一維數組地址嗎?

#include<stdio.h> 

main() { 
    int s[4][2] = { 
        { 1234, 56 }, 
        { 1212, 33 }, 
        { 1434, 80 }, 
        { 1312, 78 } 
        }; 
    int i ; 
    for (i = 0 ; i <= 3 ; i++) 
     printf ("\nAddress of %d th 1-D array = %u", i, s[i]) ; 
} 
+1

「*不工作*」是您可以給出的或多或少值得的錯誤描述。請更準確地說,你期望什麼以及你實際得到了什麼。 – alk

+0

您提交的代碼很好,使用'%p'而不是'%u'以十六進制格式打印地址。 –

+0

使用'(int *)s + i'代替's [i]',也使用'%p'而不是'%u' – BLUEPIXY

回答

2

爲了更精確和不使用該陣列是由一個指針傳遞給功能(printf()這裏)的C功能,可以使用指針來陣列這裏:

for (i = 0 ; i < 4 ; i++) { 
    int (*ptr)[2] = &(s[i]); 

    printf ("\nAddress of %d th 1-D array = %p\n", i, (void*)ptr) ; 
} 

之間的差s[i]&(s[i])是,即s[i]的1d陣列,類型是int[2],其中&(s[i])是指向int[2],你想在這裏。

你可以看到它,例如,與sizeof操作:sizeof(s[i])2 * sizeof(int)這裏,在這裏sizeof(&(s[i]))有一個指針變量的大小。

+0

的'[1]'和'&(s [i])'實際上是指向相同地址的指針,但是具有不同的類型。 – alk

6
#include<stdio.h> 

int main() 
{ 
    int s[4][2] = { 
        { 1234, 56 }, 
        { 1212, 33 }, 
        { 1434, 80 }, 
        { 1312, 78 } 
       } ; 

    int i ; 
    for (i = 0 ; i < 4 ; i++) 
     printf ("\nAddress of %d th 1-D array = %p\n", i, (void *)s[i]) ; 

    return 0; 
} 

正如您在發佈代碼中使用%p格式見打印地址。該格式說明符需要一個void *作爲傳遞的參數。