有人请解释以下代码的输出..
#include <stdio.h>
int main()
{
int arr[5];
// Assume base address of arr is 2000 and size of integer is 32 bit
printf("%u %u", arr + 1, &arr + 1);
return 0;
}
还解释了“printf”语句被以下
替换的时间1. printf("%u %u", arr + 1, &(arr + 1));
2. printf("%u %u", arr + 1, &arr + 2);
答案 0 :(得分:1)
首先,最好使用专为指针设计的格式说明符%p
而不是格式说明符%u
在本声明中
printf("%u %u", arr + 1, &arr + 1);
表达式arr + 1
中的数组arr
被转换为指向其第一个元素的指针。因此它在转换int *
后具有类型,相应地,它指向的元素具有类型int
。由于指针算术表达式arr + 1
将指向第二个元素的数组的下一个元素。所以指针的值arr
+ 1 is greater than the value of pointer
arr by
sizeof(int)`
在此表达式中,&arr + 1
指针&arr
的类型为int ( * )[5]
。它指向的元素(即数组arr
)具有类型int[5]
。所以表达式&arr + 1
的值大于&arr
的值sizeof( int[5] )
对于表达式&(arr + 1)
,它不会编译,因为arr + 1
是一个临时对象,你可能不会获取临时对象的地址。
答案 1 :(得分:0)
第一个printf
的输出将是(根据您指定的假设) - 2032 2160
当arr+1
指向下一个元素arr [1]而&arr+1
中的arr
是int(*)[5]指向int [5]因此{{ 1}}加上int [5]的大小(在你的情况下是5 * 32)。
在你的第二个address of arr that is base address
printf
中,不是左值,因此不占用内存中某些可识别的位置。因此会出错。
Thrid &(arr+1)
将输出为printf
。可以在第1 2032 2320
条中进行评估。
答案 2 :(得分:0)
上述代码的输出是2004 2020。
值arr和&amp; arr产生相同的结果,因为数组未初始化,它将打印地址值代替其值。
这是因为当你打印(arr + 1)时bcz,它将arraytype的大小,即int(4byte)添加到结果
但是当你做(&amp;(arr + 1))时,它会将整个数组的大小,即(5 * 4 = 20字节)加到基地址。
当你打印&amp;(arr + 1)它会产生错误bcz它现在会处理&amp;作为一元&amp;不是寻址算子