C言語のきほん「ポインタの基本(14)文字列とポインタ(2)」

スポンサーリンク
C言語 C言語

今回は、「配列による文字列」と「ポインタによる文字列」の相違点についてご紹介しよう。

ポインタによる文字列の書き換え」するプログラムである。

なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.0)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。

//ポインタによる文字列の書き換え

#include <stdio.h>

int main(void)
{
    char *p = "789";

    puts("代入前の文字");

    printf("*p = \"%s\"\n",p);

    p = "123";

    puts("代入後の文字");

    printf("*p = \"%s\"\n",p);

    return 0;


}

実行結果

代入前の文字
*p = "789"
代入後の文字
*p = "123"

これが、「配列による文字列」になると、結果は異なる。

 char s[] = "ABC";

    puts("代入前の文字");

    printf("*p = \"%s\"\n",s);

    p = "DEF";     //エラー

    puts("代入後の文字");

    printf("*p = \"%s\"\n",s);

「p = “DEF”;」は、エラーとなる。配列への代入は行えない

ポインタによる文字列

代入前

ポインタpは、文字列リテラル”789″の先頭文字’7’を指すように初期化される。

代入後

代入の結果、ポインタpは、文字列リテラル”123″の先頭文字’1’を指すように更新される。

文字列をコピーしているのではない。ポインタpの指す先を別の文字列リテラルの先頭文字に更新している。

代入の結果、文字列リテラル”789″はどこからも指されなくなる。プログラムからアクセスできなくなるので、ゴミとなる。

参考) 新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ

コメント

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