C语言程序运行的一个小问题,求解释

#define xb 5
int main()
{
    float values[xb];
        float* vp;
        for (vp = &values[0]; vp < &values[xb];)
        {
            *vp++=0;
        }
}

vs里为什么这个&values[5]不会造成缓冲区溢出,按理说溢出的下标会造成缓冲区溢出啊

&values[5]只是得到地址,并没有操作,所以不会引起系统报错。但是对values[5] 进行读取赋值就不行