sizeofについて の変更点 - アールメカブ

アールメカブ


sizeofについて の変更点


[[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;  
 
 }