• ベストアンサー

ポインタのポインタの使い方

文字列の途中からの部分を表示させる場合もあって、途中からの 位置というのをcahr**型の配列に記憶させることにしました。 ポインタとnewがよく分からないから、それに近いサンプルを 作って実験しているところです。 #include <iostream.h> main() {  char selected[][6] = {"full", "nomal", "short"};  char *buf;  char **p;  buf = new char[500];  strcpy(buf, ",東京都,千代田区,九段南");  p = new char*[3];  for(unsigned int i=0, j=0; i<strlen(buf); i++)  {   if(buf[i] == ',')p[j++] = &buf[i+1];  }  for(int i=0; i<3; i++)  {   cout << selected[i] << "-" << p[i] << endl;  }  delete [] buf;  delete [] p; } 結果は full-東京都,千代田区,九段南 nomal-千代田区,九段南 short-九段南 で、問題なさそうに見えるけど心配だから質問しました。 このソースに問題はないですか? 得に、 char **p; と p = new char*[3]; と p[j++] = &buf[i+1]; と delete [] buf; が心配です。

質問者が選んだベストアンサー

  • ベストアンサー
  • s2t
  • ベストアンサー率79% (47/59)
回答No.3

配列で処理する場合と、ポインタで処理する場合では後者の方がパフォーマンスが良いです。 ただ、最近のコンパイラは賢いので、配列でもポインタでもあまり差はないと言われています。 ポインタに関する理解が曖昧な場合、バグを組み込みやすいので配列を用いた方が無難です。 実験でGCCでコンパイルして10万回実行するのにかかった時間を計測し、それを5回行いその平均値を求めると 配列で処理した場合、58秒 ポインタで処理した場合、44秒 という結果になりました。 ご参考までに。

A__
質問者

お礼

ありがとうございます。ポインタでの処理の方が速いとは知りませんでした。 実験もありがとうございます。

その他の回答 (2)

  • s2t
  • ベストアンサー率79% (47/59)
回答No.2

特に問題はないと思います。 敢えて突っ込ませて頂きますと、 for(unsigned int i=0, j=0; i<strlen(buf); i++) がforの条件を評価する際に毎回strlen()が実行されるので無駄かと思います。 以下はコードの読みやすさを考えるとダメかもしれませんが、パフォーマンスを重視する場合のサンプルです。 int main(int argc, char *argv[]) { const char *sec[3] = {"full", "normal", "short"}; char *buf = new char[500]; char **p = new char*[3]; strcpy(buf, "東京都,新宿区,西新宿"); int n = strlen(buf); *p = buf; for(unsigned int i = 0, j = 1; i < n; i++) { if(*(buf+i) == ',') *(p+(j++)) = (buf+i+1); } for(int i = 0; i < 3; i++) { cout << *(sec+i) << " - " << *(p+i) << endl; } delete[] p; delete[] buf; return 0; } yatokesaさんへの回答になりますが、 newで割り当てたメモリはdeleteで,new[]で割り当てたメモリはdelete[]で解放することになっています。 どちらでも解放できるかもしれませんが、これに従わなかった場合の動作は未定義です。

A__
質問者

補足

ありがとうございます。パフォーマンス重視の方がいいです。 for()でstrlen()が毎回実行されるのは気がつきませんでした。 s2tさんが書いてくれたソースは、ポインタの配列表現が 別の表現で書いてあります。 (char *)型の文字列の場合、例えば左辺値なら、  buf[i] よりも *(buf+i)、 例えば右辺値なら、  &buf[i] よりも buf+i、 の方がいい。速いというこですか?

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

問題ないですよ。きれいにできてると思います。 #実を言えば、delete [] buf; の []の意味がよくわかってなかったりしますが...^^;)。 仕様的に「東京都」の前のカンマが気になりますが....。 #プログラムを作りやすくするために先頭にカンマを入れないといけないと言うのであれば、と言うことです。

A__
質問者

お礼

ありがとうございます。問題なくて安心しました。 s2tさんが回答してくれたけど、東京都の前のコンマのことで p[0]は&buf[0]だと分かっているから、そこは改良した方が いいですねー。

関連するQ&A