ここから本文です

キャスト変換?

ina********さん

2014/8/610:12:07

キャスト変換?

について

C言語の文字列とポインタに関する演習問題に関する質問です.
http://nekohand.web.fc2.com/meikai/neko_meikai_c_ans.html#practice1...

上記URLで,課題としては,
文字列strから,文字cを探して,あればその文字へのポインタを返して,
なければ,NULLを返すというものです.

以下関数内で,よくわからない部分が一つ.

char *str_chr(const char *str, char c)
{
char *find;//char型ポインタ
find = NULL;//見つからなければNULL

do {
if(*str == c) {
find = (char*)str;//(1)
break;
}
} while(*str++);

return(find);
}


(1)の部分で,(char*)というものがあり,調べたら,キャスト変換というものらしいのですが,
なぜこれが必要なのでしょうか?

findも,strもchar型のポインタだと思うのですが,違うのでしょうか?

ちなみに,(char*)を外した場合,警告”問題のあるポインタの変換”が表示されましたが,実行は出来ました


解説お願いします.

閲覧数:
400
回答数:
5

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2014/8/621:43:53

まず、コードを整理します。

char *str_chr(const char *str, char c)
{
ㅤㅤdo {
ㅤㅤㅤㅤif (*str == c)
ㅤㅤㅤㅤㅤㅤreturn (char*)str;//(1)
ㅤㅤ} while(*str++);
ㅤㅤreturn NULL;
}

余分な変数は取り除きました。ではここで改めて「キャストがなぜ必要か」考えてみたいと思います。

str_chr 関数が返すデータの型は何ですか?char* 型ですよね。で、引数の str ですけれども、これ、何型?const char* 型です。

異なる型です。const っていうのは書き込み禁止っていう意味なんですよね。str が指すメモリ領域に文字を書き込んじゃダメよっていう話です。でも str_chr 関数は非 const の char* を返すわけで、そうすると str をそのまま返すと型が違う。これは困った。困った時のキャスト。だから、(char*) というキャスト演算子(これ、演算子なんですよ)を使ったのでした。

《備考》

C++ の話をさせてもらっても良いですか?あのですね、C++ プログラマの場合は

return const_cast<char*>(str);//(1)

こうやって書きます。const char* と char* って、const だけが違いですよね。それなのに問答無用の最強の(あるいは最悪の)キャスト演算子、(char*) で対処するのって、あまりに酷過ぎる。ですから、const 、非 const の違いだけを埋めるための専用のキャスト演算子を使うのです。それが C++ に備わっていますからね。C++ には気の利いたキャスト演算子が他にもありますよ。この場での詳述は避けますけど。

キャスト演算子は使えば使う程プログラムの質を落とします。必ず。だから、使わないようにしましょう。でも、どうしても使わなければならない場面がありますので、その時は、仕方ないなぁ…って呟きながら使う。これが正しい(?)キャスト演算子の使い方です。…違うか。

質問した人からのコメント

2014/8/12 12:55:51

感謝 ありがとうございます!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

niikoujpさん

2014/8/614:18:40

const char *

char *
は、厳密にいえばデータ型が違うから、警告が出る。
http://www.g-ishihara.com/c_dt_01.htm

しかし、const char型のポインタをchar型のポインタとして、
無理やり代入しても、コンパイル時に警告が出るだけで、実行に問題は無い。

警告が出ない様に、キャストを使う。

meigr01さん

2014/8/613:20:16

関数char*str(){....}
に合わせて戻り値(return(find))をキャストしているのでしょう。
つまりNULL以外が帰ってくれば、見つかったということでしょう。

k03********さん

2014/8/610:28:47

inainmogさん

char *str_chr(char *str, char c)
{
while(*str != '\0'){
if(*str == c) {
return(str);
}
++str;
}
return(NULL);
}

プロフィール画像

カテゴリマスター

cd6********さん

2014/8/610:18:56

str の型は const char * 型です。
これを、find に合わせるために、(char *) とキャストしているわけです。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる