c - 指针增加 1,2,3 或在数组中后增加

标签 c arrays pointers printf increment

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float *pf;
    float m[][3]={  
        {0.1, 0.2, 0.3},
        {0.4, 0.5, 0.6},
        {0.7, 0.8, 0.9} 
    };
    printf("%d  \n",sizeof(m));
    pf=m[1];
    printf("%f   %f   %f  \n",*pf, *(pf+1), *(pf+2));
    printf("%f   %f   %f  \n",*pf, *(pf++), *(pf++));
}

我确实理解倒数第二个 printf 的输出。如果我错了,请纠正我。指针pf存储m[1]的第一个元素的地址。 *pf 转到第一个元素并输出 0.4,*(pf+1) 递增并跳转到下一个元素地址并输出该元素,依此类推。 我没有得到的是最后一个 printf。不应该是类似的事情吗?假设最后一个 printf *pf 转到 pf 中存储的地址(与 m[1] 的第一个元素相同),因此输出应该是 0.4,但输出是 0.6。对于 *(pf++) 应递增到下一个元素并输出第二个元素,即 0.5,最后一个 *(pf++) 也应输出 0.5,但输出 0.4。请解释一下我真的很困惑。

最佳答案

编译器可以按照它喜欢的任何顺序自由地计算函数的参数。在您的情况下,编译器选择按以下顺序评估参数:

*pf, *(pf++), *(pf++)
3rd  2nd      1st
  1. 首先计算第二个*(pf++)pf 指向 0.4,即表达式的值,然后 pf 递增。

  2. 第一个 *(pf++) 其次进行计算。 pf 指向 0.5,即表达式的值,然后 pf 递增。

  3. *pf 被评估为第三。 pf 指向 0.6。

  4. printf() 打印

    0.6 0.5 0.4
    

您的代码是未定义行为的典型示例。

关于c - 指针增加 1,2,3 或在数组中后增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060965/

相关文章:

c++ - 位域,为什么特定于实现?

c - FuncA 未在此范围内声明 C 编程错误

javascript - 按钮创建功能代码错误无法定位

javascript - React js 中的数组重新排列

c - 使用 Malloc 输入字符串后程序崩溃

C:在文件中使用 CR

C编程。如何深拷贝结构?

arrays - 如何在 HIVE 中合并具有不同模式的表?

C 从 char 指针一点一点地读取

c - C 中的字符串与指针连接