C言語:printfで%s指定したときの引数はなぜ配列名なのか?

C言語初級

結論から言うと、

printf関数に書式指定文字列%sを指定した場合、引数の番地が指す文字からヌル文字(\0)までを表示するから

です。

上記を理解するための前提知識が必要になります。
以下を読んでください。

C言語で char str[5]; などと配列を宣言した場合、strと記述すると配列の先頭番地 &str[0]を省略して記述したことになります。(←これをC言語入門当時知らなかった!)

この省略形は、printf関数の%s書式でよく利用されますが、strが&str[0]の省略形であるという説明が省略(笑)されていたりするので、「そういうもんだ」で終わらせている人も多いかと思います。

&って何だ?という方はC言語のポインタについて理解を深めてください。
ポインタはコンピュータのメモリに関しての話です。

もう少し具体的に説明します。

次のプログラムを例にとります。

#include <stdio.h>

int main(void)
{
    char str[] = "Hello!";

    printf("%s", str);
    
    return 0;
}

表示結果

Hello!

通常printf関数で、文字列表示する場合、上記のように%sの書式指定文字列を指定します。

char型の配列を%sで表示したいときは、配列名だけ記述すればいいよ、とどこかで見たのですがどうも腑に落ちませんでした。

自分でprintfをちょっと修正してみたら腑に落ちました。

#include <stdio.h>

int main(void)
{
    char str[] = "Hello!";

    printf("%s", &str[0]);
    
    return 0;
}

表示結果

Hello!

strはもともと省略形なので、引数にchar型配列strの先頭番地 &str[0] を指定しても結果は同じです。

ではこれはどうだ?と考えて更に修正したのが以下のプログラムです。

#include <stdio.h>

int main(void)
{
    char str[] = "Hello!";

    printf("%s", &str[2]);
    
    return 0;
}

配列の3番目の番地(&str[2])をあえて指定してみました。

表示結果

llo!

配列のstr[2]に代入されている文字からヌル文字(\0)までが表示されていることが分かります。

printf関数の%s動作イメージを図にするとこんな感じです。

printf関数の%s書式は、引数の指す番地の内容から\0までを表示する命令だったのです。

コメント

タイトルとURLをコピーしました