ポインタを使って、関数に引数として動的割り付けで初期化したオブジェクトを渡し、関数内で処理を行う。
test.cpp
#include <stdio>
using namespace std;
void rewrite(int* q);
int main(){
int* p = new int(10); // (1)
cout << "Before : " << p << endl;
rewrite(p);
cout << "After : " << p << endl;
return 0;
}
void rewirte(int* q){
*q = int(20); // (2)
}
一般的な、書き方をすると上のような感じなのかな...
ポインタは、変数のアドレスを入れておける箱。
(1)そのポインタに動的割り付けをしたオブジェクトのアドレスを入れる。
次に、関数にそのポインタを入れる。
関数の引数は、"オブジェクトのポインタ"である。
(2)関数内で、"オブジェクトのポインタ"の持つ値を書き換える。
すると、main関数内で、"オブジェクトのポインタ"の持つ値が変わる。
出力結果は以下の通り。
cout
>>> Before : 10
>>> After : 20
で、やりたかったことは、ROOTのヒストグラムを様々な場合に応じて作成したいときの方法。
べた書きで、同じヒストグラムを何度も書いてもいいんだけれども、それでは面倒なので、関数を呼ぶことで、ヒストグラムを作りたいと思った次第。
MakeHist.cpp
MakeHist(){
TH1D* hh = new TH1D();
HIST(hh);
TCanvas* c1 = new TCanvas("c1","c1",700,500);
c1->cd();
hh->Draw();
}
void GG(TH1D* h){
*h = TH1D("h","h",50,0,50); // <-- important
for(int i = 0;i<1000;i++){
h->Fill(gRandom->Uniform(0,50));
}
}
上のようなマクロを作った。これで、関数内で、ヒストグラムを作れる。
重要なのは、関数内のimportantの所。このhに*をつけないとうごかない(当たり前だね!)。