[[Programming]] sizeof の使い方を多少誤解していた.[[ここ:http://www.kis-lab.com/serikashiki/C/C03.html]]にこんな情報がある.ついでに,授業などで以下は使える.引用する. > for ループの例 sizeofの使い道の一つとしてforループのループ数の指定にあります. forの例 < double data[50]; double sum = 0; for(int i = 0; i < sizeof(data) / sizeof(data[0]); ++i){ sum += data[i]; } > ここで,sizeof(data)は,data[50]全体を指しますので,8 (double型のサイズ) x 50 = 400 となります. 次に,sizeof(data[0])は,一つの要素を指しますので,8 (double型のサイズ) となります. そのため,400 / 8 = 50となり,dataの持つ要素数となります. この方法で書いておくと,dataの型を変更した場合や,要素の数を変更した場合でもforの条件を書き換えずに,要素全てに対して処理をおこなうことができます. forに使えない例 < double *data; double sum = 0; data = (double*)malloc(sizeof(double) * N); for(int i = 0; i < sizeof(data) / sizeof(data[0]); ++i){ sum += data[i]; } free(data); > ここで,sizeof(data)は,data全体ではなく,dataの型つまりdouble *のサイズを示してしまいます.そのため,前の例のように,Nの回数分だけforの処理をすることはできません. < 例としてこんなプログラムを作成 例としてこんなプログラムを作成(石田作成) #include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int main(int arg, char *argv[]){ string str[] = {"cake", "cheese", "cherry"}; int x; cout << "how many elements in str? " << (x = sizeof(str)/sizeof(str[0])) << endl; for(int i = 0; i < x; i++){ cout << "length of str[" << i << "]=" << str[i].length() << endl; } // vector クラスを使ってみる vector<string> vec; vec.push_back("cake"); vec.push_back("cheese"); vec.push_back("cherry"); // while(vec.size())でも良いが iterator を使うと x = 0; vector<string>::iterator pv = vec.begin(); while(pv != vec.end()){ cout << "vec." << x++ << " = " << *pv++ << endl; } return 0; }