我有以下代码:
#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相同?
答案 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永远不能在此函数中重新定义,因此无需将其存储在内存中。