2010-12-02 38 views
2

数组的数组名称和地址,我有以下代码:关于用C

#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和& arr给出了相同的结果?我可以理解,arr是一些内存位置,* arr或arr [0]是存储在该位置的值,但为什么& arr和arr是相同的?

+2

void main()是baaaad。 – Puppy 2010-12-02 22:08:39

+0

[数组索引和地址返回相同的值可能重复。](http://stackoverflow.com/questions/3642157/array-index-and-address-return-same-value) – 2010-12-02 22:11:10

回答

4

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

(一个值得注意的例外到阵列到指针转换处于sizeof参数)。

2

他们的定义是相同的(即因为语言的设计者选择了他们的意思是一样的。)

0

ARR就像一个恒定指针处理,它计算到您的整数数组所在的存储器地址。内存位置arr评估为无法更改。请求arr的地址是没有意义的,因为在存储这个常量指针的地方没有地方。

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