数组标识符与数组标识符地址的区别

时间:2012-02-23 05:49:44

标签: c

以下程序会清楚地表明我的怀疑,所以我发布了该程序:

 #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

4 个答案:

答案 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("------");这只会比较指针的地址与数组第一个元素的地址。