#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
首先计算第二个
*(pf++)
。pf
指向 0.4,即表达式的值,然后pf
递增。第一个
*(pf++)
其次进行计算。pf
指向 0.5,即表达式的值,然后pf
递增。*pf
被评估为第三。pf
指向 0.6。printf()
打印0.6 0.5 0.4
您的代码是未定义行为的典型示例。
关于c - 指针增加 1,2,3 或在数组中后增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060965/