指针在数组

时间:2017-02-06 05:35:52

标签: 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。请解释我真的很困惑。

1 个答案:

答案 0 :(得分:1)

编译器可以随意以任何顺序评估函数的参数。在您的情况下,编译器选择按以下顺序评估参数:

*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
    
  5. 您的代码是未定义行为的典型示例。