指针的指针在儿维数组传值的一个有关问题

指针的指针在儿维数组传值的一个问题
 
  题目:用指针的指针实现字符串数组的排序

代码如下:
#include<stdio.h>
#include<string.h>

void sort(char **p)
{
 char *temp;
 for(int i=0;i<5;i++)
  for(int j=i+1;j<5;j++)
  if(strcmp(*(p+i),*(p+j)) > 0)//因为比较的是指针指向的字符串所以得用strcmp
  { 
  temp=*(p+i);
  *(p+i)=*(p+j);
  *(p+j)=temp;
  }
}

void main()
{
 char str[5][20],*pstr[5];
 char **p;
  p=pstr;
 for(int j=0;j<5;j++)
  pstr[j]=str[j];
 printf("input 5 strings:\n");
 for(int i=0;i<5;i++)
  gets(pstr[i]);
 sort(p);
 printf("now the sequences sort:\n");
 printf("--------********------:\n");
  for(i=0;i<5;i++)
  printf("\t%s\n",pstr[i]);//打印的时候不能用数组的str[i],为什么就不是之前的引用呢?
 printf("--------********------:\n");
}


问题:为什么“红色字体注释行”的输出变量非得用pstr[i]而不能像普通指针传递的参数那样用str[i]输出?

谁能解释下是什么原因呀!

------解决方案--------------------
探讨

因为在 sort 函数里你交换的是 pstr[] 的元素指针,即交换 pstr[i] 和 pstr[j] 所指向的字符串,而放在 str 里的那些字符串本身完全没有动过。你可以在 调用 sort(pstr) 之前和之后,打印下各个 str[i] 看看是不是还是原来的样子。如果要交换 str[i],sort 函数里面要用C/C++ code
//...
if(strcmp(*(p+i),*(……

------解决方案--------------------
看来已经解释的差不多了。
if(strcmp(*(p+i),*(p+j)) > 0)//因为比较的是指针指向的字符串所以得用strcmp
{
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
这样交换的只是指针的值,可是作为参数传递的是指针的副本,当函数结束后就不存在了。所以对指针副本的操作就丢失了
------解决方案--------------------
探讨

看来已经解释的差不多了。
if(strcmp(*(p+i),*(p+j)) > 0)//因为比较的是指针指向的字符串所以得用strcmp
{
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
这样交换的只是指针的值,可是作为参数传递的是指针的副本,当函数结束后就不存在了。所以对指针副本的操作就丢失了