[英]the difference between array identifier and address of array identifier
我認為以下程序可以清楚地表明我的疑慮,因此我發布了該程序:
#include <stdio.h>
int main() {
int a[]={1,2,3,4,5};
if(&a[0] == a)
printf("Address of first element of an array is same as the value of array identifier\n");
if(&a == a)
printf("How can a value and address of an identifier be same?!");
return 0;
}
這是輸出的鏈接: http : //ideone.com/KRiK0
如果不是sizeof
或一元&
運算符的主題,則數組將求值為指向其第一個元素的(非左值)指針。
因此&a
是數組a
的地址,而a
值等於數組中第一個元素a[0]
。
數組的地址和數組中第一個元素的地址相同並不奇怪(也就是說,即使它們具有不同的類型,它們也指向相同的位置); struct
也是如此。 鑒於:
struct {
int x;
int y;
} s;
然后&s
和&s.x
指向相同的位置(但類型不同)。 如果轉換為void *
它們將比較相等。 這與&a
和&a[0]
(因此只是a
)完全相似。
如果我對你的問題正確。 您的int a[]={1,2,3,4,5};
我相信只存儲元素0的地址,因此可能不需要if(&a[0] == a)
。 c字符串理論指出,不帶括號的數組標識符是字符第一個元素的地址。 程序中未定義“ a”。 它可能會給您一個堆棧錯誤。 我會這樣寫: if(&a == a[]){printf("------");
這只會將指針的地址與數組的第一個元素的地址進行比較。
C ++在數組引用和指針之間進行隱式轉換。 之前已經被問過很多次了,例如參見這個 SO問題。
在C語言中,您可以比較兩種不同類型的指針,但是編譯器應向您發出警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.