求教,关于c的一个让小弟我很困惑的有关问题

求教,关于c的一个让我很困惑的问题
#include <stdio.h>
#include <string.h>
#define N 5
#define M 8
void fun(char (*ss)[M])
{ char *ps[N],*tp; int i,j,k;
  for(i=0; i<N; i++) ps[i]=ss[i];
  for(i=0; i<N-1; i++) {
/**********found**********/
  k= i;
  for(j=i+1; j<N; j++)
/**********found**********/
  if(strlen(ps[k]) < strlen(ps[j]) ) k=j;
/**********found**********/
  tp=ps[i]; ps[i]=ps[k]; ps[k]= tp ;
  }
  printf("\nThe string after sorting by length:\n\n");
  for(i=0; i<N; i++) puts(ps[i]);
}
main()
{ char ch[N][M]={"red","green","blue","yellow","black"};
  int i;
  printf("\nThe original string\n\n");
  for(i=0;i<N;i++)puts(ch[i]); printf("\n");
  fun(ch);
}

为什么划红线的部分可以这样写?
还有我用vc6.0调试 为什么*ss+1="ed"?
顺便问下,vc6.0如何调试,通过按alt +8 alt +6 alt +5 出来的内存内容,寄存器内容如何看啊。看不懂啊。

------解决方案--------------------
char (*ss)[M] 这是个M个指针数组,即每个都是一个字符串。。。
其中*ss = "red";*(ss+1) = "green";*(ss+2) = "blue";等等
------解决方案--------------------
*ss+1是第零行第一列的知道,*(*ss+1)才是ch[0][1]的内容
*ss[1]也是ch[0][1]的内容