5.1 関数引数とポインタ

  4.配列とポインタが混在したプログラム
 下の例は、2つの文字列を結合してその結果を表示するプログラムであり、配列とポインタが混在した例です。

#include <stdio.h>

char *pstrcat(char *str1, char *str2){
   char *head;  /* 文字列の先頭を示すポインタ */
   char *ptr;   /* 現在位置を示すポインタ */

   /* 2つの文字列分の領域を確保し、その先頭アドレスをheadに代入 */
   head = (char *)malloc(strlen(str1) + strlen(str2) + 1);

   ptr = head;  /* 初期位置をptrに代入 */

   /* 文字列 str1 の内容をアドレスptr以下にコピー */
   while (*str1 != '\0')
          *(ptr++) = *(str1++);

   /* 文字列 str2 の内容をアドレスptr以下にコピー */
   while (*str2 != '\0')
          *(ptr++) = *(str2++);

   *ptr = '\0'; /* 最後の位置に文字列の終端文字'\0'を代入 */

   return head; /* 文字列の先頭アドレスを返す */
}

int main(void){
   char str1[100], str2[100];

   scanf("%s",str1);
   scanf("%s",str2);
   printf("%s\n",pstrcat(str1,str2));
}
 この関数では最初 head と ptr は同じところを指しています。次にポインタ ptr の値を順次増やしながら、str1 と str2 をコピーしていきます。最後に先頭のアドレス(head の値)を関数の返り値として返します (char *pstrcat(…)のように、関数自体が文字型のポインタ値を返すように宣言されているのがわかるでしょう)。この様な関数の場合は実引数として与えられる文字列の長さは前もってわからないので、その場で領域を動的に割り当て、ポインタで処理する方が便利です。

 また、例のように実引数は配列名(str1, str2)を書き、仮引数はポインタ変数で受けてもよいことがわかります。