なんで文字列を関数に渡すときの引数はポインタなの?[C言語入門]

[結論] 文字"配列"だから


C言語には文字列型がないっていうのは、すごく有名な話なのに、文字配列で躓いてしまうのはこの書き方が悪いと思うんだ。

入門書でよくある書き方

それはさておき、int型の配列ってどうやって関数に渡す?

 #include  <stdio.h>

void inoki(int a_p[]) {

    for (int i = 0; i < 3; i++) {
        printf("%d ", a_p[i]);
    }
}

int main(void) {

    int antonio[3];

    antonio[0] = 1;
    antonio[1] = 2;
    antonio[2] = 3;

    inoki(antonio);

}


多分こんな感じだと思うんだ。おそらくほとんどの人は

「えー、int 型の配列だから配列名(※1)を渡して関数のところの引数には配列の[]をつけて(※2)っと、完成!」

※1 配列名
※ 関数のところの引数(仮引数)

これは、大正解!!素晴らしい。

文字配列も実は一緒

実は例1のプログラムは例2とやってることが一緒なんだ。

例1
例2

試しに、下のプログラムを動かしてみてほしいんだ

 #include  <stdio.h>

int main(void) {
  

    char good_bye[10] = "Good bye";
    char hello[10];

    hello[0] = 'H';
    hello[1] = 'e';
    hello[2] = 'l';
    hello[3] = 'l';
    hello[4] = 'o';
    hello[5] = '\0';

    printf("%s\n%s", good_bye, hello);
}


写真バージョン

どっちも、正しく動いたと思う。
そう、実はint型の配列と同様に、意識していないけど文字列は文字[char型]の配列に格納されていくんだ。

じゃあ、文字列を関数に渡したいときは

int型と同じように、char型の配列だから、配列名を渡して
関数の引数には配列の[]をつける!

 #include  <stdio.h>

void oyasumi(char good[]) {
    
    printf("%s", good);
}

int main(void) {
  

    char good_bye[10] = "Good bye";

    oyasumi(good_bye);
}


まとめるよ

C言語には文字列型っていうのは、なくて、その代わり文字の配列として
扱っているんだ。


細かいおまけ

実は、関数に配列は渡していないんだ。というか配列を渡すときは「配列の参照を渡す!」みたいな書き方をしている媒体がちょいちょいあるんだけど実際は

どっちも「値渡し」

ただそれが、ガチの値なのか、配列の先頭のアドレス(0x7ff~~)なのかっていう違いだけなんだ。

読んでくれてありがとう。勉強するにつれて上の書き方はあくまで理解の役には立つけど完全な正確な書き方じゃないって気づくと思う。けど、
まずは書くのを楽しまなくちゃね。このくらいの理解でも大丈夫だと思うんだ。

この記事が気に入ったらサポートをしてみませんか?