#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。请解释我真的很困惑。
答案 0 :(得分:1)
编译器可以随意以任何顺序评估函数的参数。在您的情况下,编译器选择按以下顺序评估参数:
*pf, *(pf++), *(pf++)
3rd 2nd 1st
首先评估第二个*(pf++)
。 pf
指向0.4,这是表达式的值,然后pf
递增。
第二个评估第一个*(pf++)
。 pf
指向0.5,这是表达式的值,然后pf
递增。
*pf
评估为第三名。 pf
指向0.6。
printf()
打印
0.6 0.5 0.4
您的代码是未定义行为的典型示例。