解释一下下面代码最后一次循环之后的指针指向哪里?

int  var[] = {10, 100, 200};
int  i, *ptr;
ptr = var;
   for ( i = 0; i < MAX; i++)
   {

     /* ptr 改为:(unsigned int)ptr */
      printf("存储地址:var[%d] = %d\n", i, ptr );


      printf("存储值:var[%d] = %d\n", i, *ptr );
      /* 指向下一个位置 */
      ptr++;
   }

循环进入最后一次的时候ptr指向的是最后一个元素,最后一次循环借宿的时候ptr又从最后一个元素向前移动了一个步长,这是指针指向哪里呢?指针移向下一个元素之前已经指向最后一个元素了啊

max是不是要比var数组长度大,溢出的话,指针指向空间内任意位置地址,可能会非法访问,不建议这样操作

#include <stdio.h>
int main()
{
int  a[5]={ 1,2,3,4,5 };    //定义一个一维数组 a
int  (*prt)[5];      // 步长为 5 的数组指针,指针指向的数组里的 5 个元素  这和常规的 int *prt;定义指运用时有区别
prt=&a;    // 把数组 a 的地址赋给 prt,则 prt 为数组 a 的地址,*prt 表示数组 a 本身但却无法直接求出数组(能直接表示的值是数组首元素的地址)
prt[ 0 ];    //表示数组首元素的地址,它也是整个数组的地址,只不过根据指针定义哪一行这里可以这样表示,prt、*prt都和它同意
*prt[ 0 ];  //表示数组的首元素的值,即为数组 a 的 1
**prt;         //表示数组的首元素的值,即为数组 a 的 1;根据指针定义那一行,*prt表示首元素的地址
*prt[ 1 ] ;   //表示指向数组的下一行的首元素的值,但是a是一维数组,只有一行(也是另一种形式的越界),所以指向的地址会随机给一个,那么值也会随机给一个;
return 0;
}
把上面的各种地址和值打印出来,我发现打印*prt[1]的地址时会给一个Ox整数,说明会分配一个地址的,甚至还给了一个地址中存储的数据的值;并且问题中的代码我在循环结束后尝试打印也有地址,说明了会指向任意位置;暂时没有出现你说的指针越界问题;

img

只有3个元素, 如果超出的话, 会提示out of bounds.

img