char arr[10]="hello";
我猜&arr
在這個陣列中的類型是char(*)[10]
。 如果我是對的,*(&arr)
的類型是什麼?數組中的第一個元素是基類型地址還是地址類型?單維陣列地址
char arr[10]="hello";
我猜&arr
在這個陣列中的類型是char(*)[10]
。 如果我是對的,*(&arr)
的類型是什麼?數組中的第一個元素是基類型地址還是地址類型?單維陣列地址
考慮:
char arr[10];
就像你說的,&arr
是char (*)[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]
)添加到該地址。
可以擴展的例子,你認爲合適添加其他值。
表達*(&arr)
是相同的類型arr
。解除引用和操作符地址相互抵消。
您使用地址的運營商&
得到的地址,即獲得一個指針。您可以使用解引用運算符*
來獲取指針指向的值。因此,在這種情況下使用這兩種方法都沒有任何意義。
那麼它的基地址是正確的? – user1762571
@ user1762571是的。 –
*(&arr)
是型基地址,其中,作爲*(&arr[0])
是陣列中的第一個元素的。
char arr[10];
arr
具有類型「的10個字符陣列」和&arr
是「指針的10個字符陣列」。 ,*(&arr)
與arr
相同,並且具有相同的類型,即基地址。
&arr[0]
將產生指向第一個元件的地址的指針。
a,*(& a),& a [0]是相同的(數組a的基地址/數組a的第一個元素的地址)。
謝謝。那麼基地址的類型是什麼?它是char *嗎? – user1762571
術語'基地址'沒有明確定義。然而,表達式'arr'的類型是'char [10]',但在大多數情況下變成'char *' - 除了sizeof(),它仍然是char [10],所以'sizeof(arr) '10。 –