【发布时间】:2010-06-07 12:21:46
【问题描述】:
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a 和 &a 如何在内部解释?
【问题讨论】:
标签: c
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a 和 &a 如何在内部解释?
【问题讨论】:
标签: c
这两个语句都打印出地址,可能是为了解释指针运算。
a 和&a 不一样,它们有不同的类型,但拥有相同的内存地址。
&a 的类型为 int (*)[10](其作用类似于指向数组的指针)a 的类型为 int [10](其作用类似于指向单个元素的指针)
因此,当您添加 1 时,请记住这些类型。指针将偏移地址包含的类型的大小。 a+1 偏移 int 的大小,即到数组中的第二个元素。 &a+1 完全超出整个数组的偏移量。
【讨论】:
&a[0] 的类型为 int * 并且行为非常类似于 a。
sizeof 来显示它们的类型差异吗?
嗯,a 是数组的第一个元素的地址,&a 是数组的地址,但显然它们的地址相同。
但是,当您从指针中添加(或减去)数字时,编译器会考虑数据的大小,因此在您的情况下(假设 int 的大小为 4 个字节)a+1 将比 a 大 4因为您将指针向前移动了一个整数,但是 &a+1 会大 40,因为您将指针向前移动了一个 10 整数数组。
【讨论】: