【发布时间】:2014-07-28 16:40:39
【问题描述】:
我编写程序来理解数组和指针之间的区别:
#include <stdio.h>
void main()
{
char arr [] ="hodaya",*ptr=arr;
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("ptr=%p\n",ptr);
printf("&ptr=%p\n",&ptr);
}
结果:
arr=0xbfd26265
&arr=0xbfd26265
ptr=0xbfd26265
&ptr=0xbfd26260
所以我阅读了以下答案:
how-come-an-arrays-address-is-equal-to-its-value-in-c
它回答了我的大部分问题,我只剩下一个问题!
我知道,当我定义指针时,我(在特定地址)定义了一个用于保存地址的空间,因此我可以像这样获取指针地址:&ptr。
但是当我定义数组时发生了什么?
【问题讨论】:
-
您有未定义的行为。
printf在给定%p时期望void *。 -
定义数组时没有什么特别的事情发生。
char arr[] = "blah";与char x = 'p';没有什么不同 - 每个都定义了一个与某些存储相关的名称。 -
@OliCharlesworth 所以它定义了一个空间来保存一些字符?因此 arr= &arr ,因为 arr 是第一位的地址? (而不是指针)
-
当您定义 arr[] 时,您创建了一个名为 arr 的内存块,它大到足以容纳“hodaya”。
-
令人困惑的是,在许多情况下,数组会自动衰减到指向其第一个元素的指针。由于这种衰减,当您打印
array时,实际上是在打印&array[0]。实际上array[0]与array的地址相同,因此&array[0]与&array具有相同的数值(尽管类型不同)。
标签: c arrays string pointers memory-address