title: Is this call by reference or by value in C?
body: <p>I'm reading a book <em>the c programming language</em> authored by Brian W. Kernighan and Dennis M. Ritchie.</p>
  <p>The book lists code below</p>
  <pre><code>void strcpy(char *s, char *t){
      while((*s = *t) != '\0'){
          s++;
          t++;
      }
  }
  </code></pre>
  <p>and says:</p>
  <blockquote>
  <p>Because arguments are passed by value, strcpy can use the parameters
  <em><strong>s</strong></em> and <em><strong>t</strong></em> in any way it pleases</p>
  </blockquote>
  <p>which I'm not agreed with. Why above arguments are passed by value?</p>
  <p>According to another book <em>C how to program</em>:</p>
  <blockquote>
  <p>In C, you use pointers and the indirection operator to simulate
  call-by reference. When calling a function with arguments that should
  be modified, the addresses of the arguments are passed.</p>
  </blockquote>
  <p>In latter point of view, it's definitely call-by-reference.</p>
  <p>Please tell me which way is correct and why, thanks!</p>
  <p>btw, after assignment <code>*s = *t</code>, which one is compared with <code>'\0'</code>? <code>*s</code> or <code>*t</code>?</p>