指针,为啥打印出来的数不对,而且地址每次打印都会变


int main()
{
    float a[5] = {0};
    float* b = a;
    for (int i = 0; i < 5; i++)
    {
        *++b = i;
        printf("%f %f\n", a[i], *b);
    }
    return 0;
}

img

1.为啥两种打印方式出来的结果不一致,我想不通a[i]为啥会有两个0,*b不就是取的a地址的值吗,怎么还对不上
2.这个警告是啥,也没报错,也没阻止代码运行,就是每次都弹出来


int main()
{
    int a[5] = {0};
    int* b = a;
    for (int i = 0; i < 5;i++ )
    {
        *b++ = i;
        printf("%d %d\n", a[i], *b + i);
    }
    printf("\n%p\n", a);
    return 0;
}

img

img

img

3.两段代码除类型外都一致,为啥float不需要+i就能完整打印数组,而int+i还最后一位溢出呢(不+i打印不出来)
4.这个地址不应该是固定的吗,为什么我打印一次就会变一次

供参考:

#include <stdio.h>
int main()
{
    float a[5] = {0};
    float* b = a;
    for (int i = 0; i < 5; i++)
    {
        *b++ = i;  //*++b = i; ++在前,指针 b 相当于 b=b+1 ==>a[1]了,此时 a[1] = i=0
        printf("%f %f\n", a[i], *(b-1));//打印时,前一句 b++ , b指向了a[1]了,所以这里改成*(b-1)
    }
    return 0;
}

//0.000000 0.000000
//1.000000 1.000000
//2.000000 2.000000
//3.000000 3.000000
//4.000000 4.000000
//请按任意键继续. . .

#include <stdio.h>
int main()
{
    int a[5] = {0};
    int* b = a;
    for (int i = 0; i < 5;i++ )
    {
        *b++ = i;
        printf("%d %d\n", a[i], *(b - 1)); //printf("%d %d\n", a[i], *b + i);
    }
    printf("\n%p\n", a);
    return 0;
}

//0 0
//1 1
//2 2
//3 3
//4 4

//0019FF24
//请按任意键继续. . .

//4.这个地址不是固定的,代码运行一次,给数组 a[5]分配的内存地址不一定都是同一处。