2013-05-30 73 views
0
char arr[10]="hello"; 

我猜&arr在這個陣列中的類型是char(*)[10]。 如果我是對的,*(&arr)的類型是什麼?數組中的第一個元素是基類型地址還是地址類型?單維陣列地址

回答

5

考慮:

char arr[10]; 

就像你說的,&arrchar (*)[10]類型。本身,*(&arr)char [10]類型,但在大多數情況下(比其他sizeof())將成爲char *在使用它。

樣品的編號:

#include <stdio.h> 

int main(void) 
{ 
    char arr[10] = "hello"; 

    printf("arr[10]   = \"%s\"\n", arr); 
    printf("arr    = %p\n", arr); 
    printf("&arr   = %p\n", &arr); 
    printf("*(&arr)   = %p\n", *(&arr)); 
    printf("sizeof(*(&arr)) = %zu\n", sizeof(*(&arr))); 
    printf("arr+1   = %p\n", arr+1); 
    printf("&arr+1   = %p\n", &arr+1); 
    printf("*(&arr)   = \"%s\"\n", *(&arr)); 
    return 0; 
} 

樣本輸出(GCC 4.7.1,Mac OS X的10.8.3):

arr[10]   = "hello" 
arr    = 0x7fff4ff15500 
&arr   = 0x7fff4ff15500 
*(&arr)   = 0x7fff4ff15500 
sizeof(*(&arr)) = 10 
arr+1   = 0x7fff4ff15501 
&arr+1   = 0x7fff4ff1550a 
*(&arr)   = "hello" 

注意,雖然arr&arr的值是相同的,類型是不同的。 arr+1&arr+1這幾行清楚地表明瞭這一點。如您所見,將&arr增加1會將指向的對象的大小(一個char [10])添加到該地址。

可以擴展的例子,你認爲合適添加其他值。

+0

謝謝。那麼基地址的類型是什麼?它是char *嗎? – user1762571

+0

術語'基地址'沒有明確定義。然而,表達式'arr'的類型是'char [10]',但在大多數情況下變成'char *' - 除了sizeof(),它仍然是char [10],所以'sizeof(arr) '10。 –

4

表達*(&arr)是相同的類型arr。解除引用和操作符地址相互抵消。

您使用地址的運營商&得到的地址,即獲得一個指針。您可以使用解引用運算符*來獲取指針指向的值。因此,在這種情況下使用這兩種方法都沒有任何意義。

+0

那麼它的基地址是正確的? – user1762571

+0

@ user1762571是的。 –

2

*(&arr)是型基地址,其中,作爲*(&arr[0])是陣列中的第一個元素的。

2
char arr[10]; 

arr具有類型「的10個字符陣列」和&arr是「指針的10個字符陣列」。 ,*(&arr)arr相同,並且具有相同的類型,即基地址。

&arr[0]將產生指向第一個元件的地址的指針。

0

a,*(& a),& a [0]是相同的(數組a的基地址/數組a的第一個元素的地址)。