2015年1月25日日曜日

C++再入門②_ダブルポインタを回避したい。

Googleで「C言語 ダブルポインタ」で検索すると、
ダブルポインタについて、非常に分かり易く説明してくれているサイト

ダブルポインタで分からなくなる度にこのページを見直す訳であるが、
「そもそもどうしても変数の先頭に*付けないといけないの?」
と疑問が浮かぶ。


プログラムを書く時、始めはmain関数に押し込んで、「取りあえず動く」事を確認し、
それから、まとまった処理毎に関数化してmain関数を軽くしていく事が多い。(少なくとも、私は……。

しかし、そのやり方だと、
関数化する際、非常に面倒になってくるのは、値の受け渡しも去る事ながら、
ダブルポインタを使わないと値を参照できないようになってしまう場合だろう。

正直、コードが長くなると、一々変数ごとに「*」を付けるのは、
非常に億劫であるだけでなく、ミスし易い大変な作業となる。

そこで、以下の様にした。




通常、ダブルポインタを使用する必要に迫られるのは、以下の様な場合である。

実行結果











これを、ダブルポインタを回避する ( 見かけ上使わずに済む ) ように記述すると、
以下のようになる。

実行結果










このように、関数の値の宣言時に、「&」を上手く使う事で、コードを書きなおす時など、
態々、変数の頭に「*(アスタリスク)」を付けずに、済むようになる。

なんで今まで試さなかったんだ、と自分を叱ってやりたい。



//
リファレンス(参照)
たぶんこの辺りの理解がまだ足りていないのだろうな……。

今回の話は、恐らく、ポインタをコールバイリファレンスで渡してやれば、
ダブルポインタを使う必要が無い、という話し。
(
「 関数 ( char* &str ) { 関数の中身; } 」  のような場合の「char*」は、関数の引数形を示しており、
それを「&」によって、コールバイ・リファレンス(call by reference)(参照による受け渡し)
によって値を受け渡している。
)

上記URLのように、
ポインタでポインタの受け渡しを行おうとすると、
当然ダブルポインタを使う必要が出てくる。
(
「 関数 ( char* *str ) { 関数の中身; } 」  のような場合の「char*」は、関数の引数形を示しており、
それを「*」によって、ポインタによる参照??
によって値を受け渡している。
)




参照とポインタ
にも、それっぽい事が書いてある。
&(リファレンス)、は、C++から導入された、とされている。
調べていないけれど、Cでは無理だったのか?




2016_11_04 追記
※ std::string で .c_str() の値を
 int func(char*& str){printf("%s",str);return 0;}
的な関数に,

std::string str = "Hello";
func(str.c_str());

と渡そうとすると,c_str()では実体と解釈されない用で,コンパイルエラーとなる.

したがって,
std::string str = "Hello";
char* cstr = str.c_str()
func(cstr);

とするか,&参照をやめる

0 件のコメント:

コメントを投稿