【问题标题】:printing the address of the array using "array name" and "address-of array name"使用“数组名”和“数组名的地址”打印数组的地址
【发布时间】:2015-09-29 07:20:09
【问题描述】:

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

#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”语句被以下替换时的out

1. printf("%u %u", arr + 1, &(arr + 1));
2. printf("%u %u", arr + 1, &arr + 2);

【问题讨论】:

  • 你期待什么输出?
  • 另外你应该使用 %p 来打印地址。
  • 数组的地址 (&amp;arr) 和数组的第一个元素的地址 (&amp;arr[0] - 当arr 衰减为指针时得到的) 具有相同的数值,但确实不是同一个意思。

标签: c arrays arraylist operators logical-operators


【解决方案1】:

首先最好使用专门为指针设计的格式说明符%p,而不是格式说明符%u

在此声明中

printf("%u %u", arr + 1, &arr + 1);

在表达式arr + 1 中,数组arr 被转换为指向其第一个元素的指针。所以它在转换后具有类型int *,相应地它指向的元素具有类型int。由于指针算术表达式arr + 1 将指向数组的下一个元素,即第二个元素。所以指针arr+的值是1is greater than the value of pointerarrbysizeof(int)`

在这个表达式中 &amp;arr + 1 指针 &amp;arr 具有类型 int ( * )[5] 。它指向的元素(即数组arr)的类型为int[5]。所以表达式&amp;arr + 1的值比&amp;arr的值大sizeof( int[5] )

至于表达式&amp;(arr + 1)则不会编译,因为arr + 1是一个临时对象,你不能取临时对象的地址。

【讨论】:

  • 只是为了让它完整:“arr + 1 是一个临时对象”.. 而不是 lvalue...
【解决方案2】:

第一个printf 的输出将是(根据您指定的假设)-2032 2160

arr+1 指向下一个元素,即 arr[1] 和 &amp;arr+1 在此 arr 是 int(*)[5] 指向 int[5] 因此 address of arr that is base address 加上 int[ 的大小5](在您的情况下为 5*32)。

在您的第二个printf &amp;(arr+1) 不是左值因此不会占用内存中的某些可识别位置。因此会出错。

第三个printf 将输出为2032 2320。可以评估为在第一个printf 中完成。

【讨论】:

    【解决方案3】:

    上面代码的输出是2004 2020。

    值 arr 和 &arr 产生相同的结果,因为数组未初始化,它将在其值的位置打印 address 的值。

    这是因为 bcz 当你打印 (arr+1) 时,它会将数组类型的大小,即 int (4byte) 添加到结果中

    但是当你这样做时 ( &(arr+1)) ,它会将整个数组的大小(即(5*4=20 字节))添加到基地址。

    当你打印 &(arr+1) 时,它会产生错误 bcz 它现在会将 & 视为一元 & 而不是寻址运算符

    【讨论】:

    • Vishesh 请查看他在问题中指定的整数大小。并且整数的大小不必总是4字节。
    • Amey 你对,整数的 abt 大小并不总是 4 字节。它因你的操作系统版本而异。我以字节形式给出我的答案,因为他没有提到 2000 的比特/字节值
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多