#include <stdio.h>
int main()
{
int a[5];
printf("%pn%pn",a+1,&a[1]);
return(0);
}
当上面的代码构建并运行时。输出为:
0029ff00
0029ff00
然后当我将第 5 行从 a + 1
更改为 &a + 1
#include <stdio.h>
int main()
{
int a[5];
printf("%pn%pn",&a+1,&a[1]);
return(0);
}
输出为:
0029ff10
0029ff00
当我包含与号 ( &
( 时指的是什么,它与格式说明符%p
有关吗?
printf("%pn%pn",&a+1,&a[1]);
在这一行中,两个地址是不同的,因为&a[1]
给出a[1]
的地址,&a+1
给出的地址是数组最后一个元素之后的一个。
&a
给出数组的地址,并向其添加1
会将数组的大小添加到数组a
的基址。
所以基本上,&a+1
=数组的基址a
+数组a
的大小(该地址被打印(
符号"&"是元素的地址,所以在printf中,它会打印出元素的内存地址。
它与格式说明符 %p 有关吗?
%p 正在访问指针(指针引用的地址(,这就是为什么你会得到像"x0000"这样的值......
尝试在任务中使用 %d 或 %i 作为整数值。
&a[1]
等效于&*(a + 1) = (a + 1)
,这就是为什么第一个代码段打印相同的地址值。
&a
是数组 a
的地址。它是类型 int (*)[5]
.将1
添加到数组&a
会将其增强到数组之外的一个,即它将向&a
数组添加 sizeof(a)
个字节。
推荐阅读: c中的数组名称到底是什么?.
"&"表示"地址",%p 格式表示将值打印为指针(地址(,指针以十六进制打印。 执行"指针算术"时,当您将指针加 1 时,指针将递增 (1 * sizeof(type((,其中"type"是指向的数据类型。
请记住,在 C 中,数组变量是一个指针。 &a 不是数组的地址,而是存储数组地址的地址。 因此,当您将 1 添加到 &a 时,&a 包含 a,这是一个指针,所以 (&a + 1( 是 (&a + size(a((,并且由于 a 是一个数组,它是数组的大小。 在这种情况下,一个 4 个整数的数组是 16 个字节。