Nodachisoft Nodachisoft logo, Katana Sword Icon
  
@あまじ✎ 2021年2月1日に更新

第2章37 char型ポインタ変数と文字列の操作

第2章37 char型ポインタ変数と文字列の操作
イチからゲーム作りで覚えるC言語
第2章36 ポインタと配列 : PREV
NEXT : 第2章38 ポインタ変数への足し算 :

この記事でやること

char 型ポインタ変数を使って、文字列を扱ってみましょう。

C 言語で文字列がメモリの中でどのように扱われているかを知っておくことで、 例えば、char 型配列としてメモリ上に読み込んだマップデータやシナリオデータといったゲームデータなどの取扱いを理解しやすくなります。

char 型のポインタ

char型ポインタ宣言&初期化
char *playername="planc";

char 型のポインタに対して、ダブルクオーテーションで囲んだ文字列を代入する式を書くことで 文字列を変数で扱うことができます。

次のソースコードでは、char型のポインタ変数 playername に、文字列「planc」を代入しています。

 
char型ポインタ変数
#include <stdio.h>
int main(){
  char *playername="planc";
  printf("プレイヤーの名前 = %s \n", playername);
  printf("変数 playername の指すメモリアドレス = %d \n", playername);
  printf("playername[0] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[0], playername[0], playername[0] );
  printf("playername[1] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[1], playername[1], playername[1] );
  printf("playername[2] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[2], playername[2], playername[2] );
  printf("playername[3] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[3], playername[3], playername[3] );
  printf("playername[4] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[4], playername[4], playername[4] );
  printf("playername[5] アドレス = %d, 文字 = %c, 数字 = %d \n", &playername[5], playername[5], playername[5] );
}

実行すると下の結果となりました。

実行結果
プレイヤーの名前 = planc
変数 playername の指すメモリアドレス = 4231168
playername[0] アドレス = 4231168, 文字 = p, 数字 = 112
playername[1] アドレス = 4231169, 文字 = l, 数字 = 108
playername[2] アドレス = 4231170, 文字 = a, 数字 = 97
playername[3] アドレス = 4231171, 文字 = n, 数字 = 110
playername[4] アドレス = 4231172, 文字 = c, 数字 = 99
playername[5] アドレス = 4231173, 文字 =  , 数字 = 0

3 行目で、先ほど「char型のポインタ変数 playername に文字列を代入している」と書いた処理が実行されます。

ポインタ変数への文字列代入
  char *playername="planc";

char型ポインタ変数と、char型変数は何が違うのでしょうか。

見た目上の違いは*が変数の直前についているだけですね。

char 型は 1バイト(ASCIIコード表での 1 文字ぶん)しか入らないはずですが、どのように文字列を保存しているのでしょうか。

ではでは、仕組みを確認してきましょう。

まず、"planc" という文字列は、実際には

planc\0

というデータとして、メモリ上に確保されます。

ダブルクオーテーションで囲んだ文字列は、最後に文字列のデータがココで終わるよ、ということを表す '\0' がつくというルールとなっているためです。 この処理は自動的にコンパイラがやってくれます。

なお、この '\0' が無理やり取っ払ったりすると、どこが終わりかわからなくなってしまい、バグの原因となります。

ポインタ変数への文字列代入
  char *playername="planc";

この行では、変数の宣言初期化を同時に行っています。

ちょっと復習になりますが、 宣言とは、××型の〇〇という変数を使いますよ、ということです。 この行では、「char *playername」 部分が宣言です。

初期化とは、変数の中身の最初の値をセットすることです。 この行では 「変数="planc"」の部分が初期化です。

この変数と初期化では、文字列 "planc" のデータの先頭の 1 文字である「p」 の文字データが入っているメモリアドレスを、playername というポインタ変数にセットする、ということを行っています。

変数の宣言と初期化を2行に分けて、下のようにも書けます。

宣言と初期化
  char *playername;
  playername = "planc";

つまり、playername というポインタ変数は、文字列そのもののデータを保持しているのではなく、 文字列の先頭部分へのメモリアドレスを持っているだけなのです。

ポインタ変数の内容表示

playername に、文字列の頭へのメモリアドレスが入っている状態となり、 次の 4 行目では、printf 関数でコンソール上で変数の内容を出力しています。

ポインタ変数への文字列代入
  printf("player name is %s \n", playername);

printf の第一引数で %s を指定すると、第二引数以降に指定した 変数の内容を書式に従って表示します。ここでは、 %s と書いた部分に playername の中身が表示されます。

printf の %s を playername の中身で置き換える処理は、

渡された変数 playername のメモリアドレスの中身を順番に取得していき '\0' が見つかったら、 表示する文字の終わりに到達したと判断して置き換え終了とする。

という処理を実施しています。

アドレスと中身の確認

プログラムを実行した時、文字列 "planc" がメモリ上でどのように扱われたか、 どのようにアクセスできるかを対応表にしたものです。

文字 'p' 'l' 'a' 'n' 'c' '\0'
データ 112 108 97 110 99 0
メモリアドレス 4231168 4231169 4231170 4231171 4231172 4231173
playername [0] [1] [2] [3] [4] [5]

メモリアドレスが 1 文字につき 1 (バイト)隣り合って保存されているのがわかります。

あとがき

今回はここまでです!おつかれさまでした。

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし
イチからゲーム作りで覚えるC言語
第2章36 ポインタと配列 : PREV
NEXT : 第2章38 ポインタ変数への足し算 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第1章01 Visual Studio Community 2019 のインストール手順

第1章01 Visual Studio Community 2019 のインストール手順

#C11仕様#C言語#ゲームプログラミング✎ 2021-08-08
C言語でプログラミングをするために、無料で使える Visual Studio Community を使った開発環境を揃えていく手順や注意点をお話しています。
目次
第2章37 char型ポインタ変数と文字列の操作
第2章37 char型ポインタ変数と文字列の操作
この記事でやること
この記事でやること
char 型のポインタ
char 型のポインタ
ポインタ変数の内容表示
ポインタ変数の内容表示
アドレスと中身の確認
アドレスと中身の確認
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2021