请有人解释一下以下代码的输出..
#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);
最佳答案
首先最好使用专门为指针设计的格式说明符%p
,而不是格式说明符%u
在此声明中
printf("%u %u", arr + 1, &arr + 1);
在表达式arr + 1
中,数组arr
被转换为指向其第一个元素的指针。因此,转换后它的类型为 int *
,相应地,它指向的元素也具有类型 int
。由于指针算术表达式 arr + 1
将指向数组的下一个元素,即第二个元素。所以指针arr
+ 1的值大于指针
arrby
sizeof( int )`
在此表达式中 &arr + 1
指针 &arr
的类型为 int ( * )[5]
。它指向的元素(即数组 arr
)的类型为 int[5]
。因此表达式 &arr + 1
的值比 &arr
的值大 sizeof( int[5] )
对于表达式&(arr + 1)
,它不会编译,因为arr + 1
是一个临时对象,你不能获取临时对象的地址.
关于c - 使用 "array name"和 "address-of array name"打印数组的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342510/