c - 使用 "array name"和 "address-of array name"打印数组的地址

标签 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);

最佳答案

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

在此声明中

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

在表达式arr + 1中,数组arr被转换为指向其第一个元素的指针。因此,转换后它的类型为 int *,相应地,它指向的元素也具有类型 int。由于指针算术表达式 arr + 1 将指向数组的下一个元素,即第二个元素。所以指针arr+ 1的值大于指针arrbysizeof( 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/

相关文章:

java - ArrayList 的 add(index,object) 方法抛出 IndexOutOfBoundException

java - 修改数组列表中的某个元素

c - STM32 USB CDC 操作

c - 管理 if 语句

c++ - 如何设置 clang-format 注释 pragmas 以便多行 doxygen 注释不会被触及?

c - 如何在 C 中使用字符串和数组计算数学表达式

c - 求时间复杂度

javascript - 过滤基于数组的属性值

arrays - ruby 使用可枚举方法为数组赋值

java - 使用 contains(Object o) 比较两个不同的对象返回 false,当 equals(Object o) 返回 true