关于C中数组的数组名称和地址

时间:2010-12-02 22:04:33

标签: c arrays pointers

我有以下代码:

#include<stdio.h>

void main()
{
    int * a;
    int arr[2];
    arr[1] = 213 ;
    arr[0] = 333 ;
    a = &arr ;
    printf("\narr %d",arr);
    printf("\n*arr %d",*arr);
    printf("\n&arr %d",&arr);

    printf("\n%d",a[1]);
}

在运行这个简单的程序时,我得到如下输出:

arr -1079451516
*arr 333
&arr -1079451516
213

为什么arr和&amp; arr都给出相同的结果?我可以理解arr是一些内存位置,* arr或arr [0]是存储在该位置的值,但为什么&amp; arr和arr相同?

3 个答案:

答案 0 :(得分:4)

几乎在任何时候使用带有数组类型的表达式时,它会立即“衰减”到指向第一个元素的指针。 arr成为类型为int*的指针,此指针实际传递给printf&arr是一个类型为int (*)[2]的指针(指向两个int s的数组的指针)。这两个指针具有相同的地址,因为它们都指向数组的开头。

(数组到指针转换的一个值得注意的例外是sizeof参数。)

答案 1 :(得分:2)

根据定义,它们是相同的(即因为语言设计者选择它们的意思相同。)

答案 2 :(得分:0)

arr被视为常量指针,它计算整数数组所在的内存地址。内存位置arr评估为无法更改。询问arr的地址是没有意义的,因为在内存中没有存储这个常量指针的地方。

您声明的非常量指针a是内存中可以保存指针的位置(内存中其他内容的位置,在本例中是arr数组的开头)。因此,&amp; a将评估除-1079451516之外的存储器地址。指针“a”具有为其分配的内存地址,因为您可以将a更改为指向其他内容,将该地址存储在指针a中。 arr永远不能在此函数中重新定义,因此无需将其存储在内存中。