使用“数组名称”和“地址 - 数组名称”打印数组的地址

时间:2015-07-10 13:51:19

标签: c arrays arraylist operators logical-operators

有人请解释以下代码的输出..

#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);

3 个答案:

答案 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;不是寻址算子