title: cannot convert parameter 1 from 'char [20][20]' to 'char ** '？
body: <p>My Code is below:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  
  void print_pointer(char **str);
  void print_array(char *str[20]);
  void print_array2(char str[20][20]);
  void print_array3(char str[][20]);
  
  int main(int argc, char *argv[])
  {
      char str[20][20] = {"test1", "test2", "test3"};
  
      print_pointer(str);
      print_array(str);
      print_array2(str);
      print_array3(str);
  
      return 0;
  }
  
  void print_pointer(char **str)
  {
      int i = 0;
      for(; i &lt; 20; i++)
      {
          printf("%s", str[i]);
      }
  }
  void print_array(char *str[20])
  {
      int i = 0;
      for(; i &lt; 20; i++)
      {
          printf("%s", str[i]);
      }
  }
  void print_array2(char str[20][20])
  {
      int i = 0;
      for(; i &lt; 20; i++)
      {
          printf("%s", str[i]);
      }
  }
  
  void print_array3(char str[][20])
  {
      int i = 0;
      for(; i &lt; 20; i++)
      {
          printf("%s", str[i]);
      }
  }
  </code></pre>
  
  <p>When I compile this code, there are two compile errors encountered:</p>
  
  <ol>
  <li><p><code>error C2664: 'print_pointer' : cannot convert parameter 1 from 'char [20][20]' to 'char ** '</code></p></li>
  <li><p><code>error C2664: 'print_array' : cannot convert parameter 1 from 'char [20][20]' to 'char *[]'</code></p></li>
  </ol>
  
  <p>My question is what's the actually difference between these 4 functions?</p>
  
  <p>Why <code>print_array</code> and <code>print_pointer</code> function could not work while <code>print_array2</code> and <code>print_array3</code> could work properly?</p>