c - 调用数组数据类型进行打印的不同方式?

标签 c arrays reference

所以,我在计算机考试中得到了这个(C gcc-4.9.2): 以下语句会给出相同的输出吗?假设a是一个数组。

a) printf("%d", a + 1);

b) printf("%d", &a + 1);

c) printf("%d", a[0] + 1);

最佳答案

Will the following statements give the same output?

简短回答:否。

详细信息如下:

假设a定义为

int a[N];

N >= 1

并且至少 a 的第一个元素已正确初始化(情况 3. 取决于后一个前提条件)。

  1. printf("%d", a + 1);

    a + 1 
    

    计算出具有值的指针

    ((char*) &a[0]) + 1 * sizeof a[0]
    

    使用 %d 打印它会调用 UB。任何事情都可能发生/被打印。使用 %p 打印 void 指针的值。使用 (void*) 转换传递的指针。

  2. printf("%d", &a + 1);

    &a + 1
    

    计算出具有值的指针

    ((char*) &a) + 1 * sizeof a
    

    (后一个值与 1. if N > 1 的结果不同。)

    使用 %d 打印它会调用 UB。任何事情都可能发生/被打印。使用 %p 打印 void 指针的值。使用 (void*) 转换传递的指针。

  3. printf("%d", a[0] + 1);

    将打印数组第一个元素初始化时的一些整数值 + 1。

关于c - 调用数组数据类型进行打印的不同方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104511/

相关文章:

检查数组是否为 ASCII

arrays - Swift 3 - 从字典数组中获取值

javascript - 用更大的数据数组填充对象数组的属性的最有效方法是什么?

java - 你曾经在任何项目中使用过 PhantomReference 吗?

对如何 hell 般地打印数组感到困惑

c - DESTDIR 和 PREFIX 的 make

c - X 处的堆 block 在 Y 处修改为过去请求的大小 - 释放分配的内存

c - 如何将两个 uint32_t 值交错为一个 uint64_t?

javascript - 转到 Web Essentials 中的定义

C# .Net Dll 引用依赖