基礎勉強をしたく、以下のプログラムにコメントを付けました。
黒い★のついている部分は自信がない疑問のある部分です。どうか正しいかどうかを問いたいです。
#include <stdio.h> #include <string.h> int main(void) { char str[] = "12345""\0""67890", * p;//★ここでpを先頭のアドレスの文字コードを扱う定義にした。 //しかしなぜこのように書けたのか正直わかりません。というのもchar str[]は「文字列の文字コード」のデータを扱う //わけじゃないですか。ってことは* p自体もアドレスではなくアドレスの「先頭の文字コード」のデータを扱うため //これでもうまくいくのかなと自己解釈しています。 p = strchr(str, '\0');//strchrを扱う際はstrの文字列の先端のアドレスが入る。そして、アドレスを+1していき //'\0'を見つけたら、その'\0'のアドレスをポインタpに渡す。 printf("|%s|\n", str);//文字列の最初のアドレスから'\0'となった部分までがstrにとなるので //printfより先頭のアドレスから'\0'までの文字列が入る。そして表示される。 printf("|%s|\n", p + 1);//そのポインタpが(printfのp + 1により)+1されたことで'\0'が今現在の //ポインタの指すアドレスとなり、そのアドレスからnullまでを表示した。 *p = '!';//そして、今現在のポインタが指すアドレスは'\0'になったアドレスであるため、 *p = '!' //により'\0'は'!'に置き換えられた。 printf("|%s|\n", str);//そのため結果が|12345!67890|となる。 }
以下は元のプログラムです。
*#include <stdio.h> #include <string.h> int main(void) { char str[] = "12345""\0""67890"; char* p = strchr(str, '\0');//★strchr関数によりchar* pはポインタpとして扱われ、上と同じような処理になる //しかしstrchr関数によりchar* pでありながらポインタのアドレス、ではなくアドレスの指す数値を扱うというのに違和感があります。 //これはstrchr関数がそういうものだからと納得するしかないのでしょうか? printf("|%s|\n", str); printf("|%s|\n", p + 1); *p = '!'; printf("|%s|\n", str); }
元のプログラムに関しては**char* p よりpはアドレスの「数値」を扱う変数だと認識しています。
そしてchar p = strchr(str, '\0');は文字列を検索する中でnullに当たったら、そのnullとなる「アドレス」を*pに渡す意味していますが、*pはアドレスの「数値」を受け取る変数なのに、なぜnullとなる「アドレス」を渡せるのかわかりません。**色々調べましたがそういうものだからという感じの説明が多く納得が出来ませんでした。
個人的には先頭のアドレスを渡すのでchar p = strchr(str, '\0');が正しいと思っていました。
プログラムに書いた黒い★の疑問と黒い太い線で書いた疑問に詳しく優しく教えてくださると大変ありがたいです。
編集
#include <stdio.h> #include <string.h>int main(void) { char str[] = "12345""\0""67890"; char* p = strchr(str, '\0');/ printf("|%s|\n", str); printf("|%s|\n", p + 1); *p = '!'; printf("|%s|\n", str); }
をcやc++でデバックしたら、char* p = strchr(str, '\0');の部分がcharとpになると思ったらcharとpに分かれていました。
理由がわかりません。
なぜこのように分かれたのでしょうか?strchr(str, '\0');からの返り値のアドレスを受け取るためでしょうか?
また、char*型とはポインタ型のcharだとわかりました。しかし、だからなんだという感じで、ポインタ型のcharとはなんなのですが?
どうか基礎を固めたいのでどうかよろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー