以下程序会清楚地表明我的怀疑,所以我发布了该程序:
#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
答案 0 :(得分:4)
当它不是sizeof
或一元&
运算符的主语时,数组求值为指向其第一个元素的(非左值)指针。
因此&a
是数组a
的地址,a
计算数组中第一个元素a[0]
的地址。
数组的地址和数组中第一个元素的地址相同并不奇怪(也就是说,即使它们具有不同的类型,它们也指向相同的位置); struct
也是如此。给出:
struct {
int x;
int y;
} s;
然后&s
和&s.x
指向相同的位置(但具有不同的类型)。如果转换为void *
,他们将比较相等。这与&a
和&a[0]
完全相似(因此只有a
)。
答案 1 :(得分:0)
C ++在数组引用和指针之间进行了隐式转换。之前已多次询问此问题,例如this问题。
答案 2 :(得分:0)
在C中,你可以通过比较两种不同类型的指针来逃避,但你的编译器应该给你一个警告。
答案 3 :(得分:0)
如果我的问题是对的。您的int a[]={1,2,3,4,5};
我认为只会存储元素0的地址,因此请if(&a[0] == a)
可能不是必需的。 c字符串理论表明没有括号的数组标识符是字符的第一个元素的地址。 &#34;&#34;没有在程序中定义。它可能会给你一个堆栈错误。我会这样写if(&a == a[]){printf("------");
这只会比较指针的地址与数组第一个元素的地址。