ページ 11

ポインタの初期化について

Posted: 2009年7月29日(水) 00:12
by チルチル
ポインタについて確認したいのですが

C++において

int *P;

と言うポインタがある場合



P=アドレス;

はポインタにアドレスを代入



*P=アドレス;

はポインタのポインタを変更だと思うのですが



int *P=アドレス;

は実行してみるとポインタにアドレスを代入してるようです

ポインタは*を付けるとポインタのポインタになりますが

int *P1,*P2;

などは紛らわしいですが

int *P;

は int*型でPを宣言しているので

*Pと書いた事にはならず

int *P=アドレス;



int *P;
P=アドレス;

と同じであり

int *P1=アドレス,*P2=アドレス;



int *P1,*P2;
P1=アドレス;
P2=アドレス;

と同じ・・と言う解釈であっているでしょうか?

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 01:00
by kazuoni
>*P=アドレス;
>はポインタのポインタを変更だと思うのですが

ではなく、エイリアス(実体)の変更(代入)です。

>ポインタは*を付けるとポインタのポインタになりますが
これも*pはポインタのポインタではなく、エイリアス(実体)です。
例えばint **pが「pはintのポインタのポインタ型」です。

>int *P=アドレス; (前者)
>は
>int *P;
>P=アドレス(後者)

>int *P1=アドレス,*P2=アドレス; (前者)
>は
>int *P1,*P2;
>P1=アドレス; (後者)
>P2=アドレス;

結果的には同じですが、両例の前者は「初期化」、後者は「代入」
という点で異なっています。
#勘違いを招くかと思ったので、前者、後者の内容追記です^^;

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 13:23
by チルチル
この場合はポインタのポインタと言う表現は不適切でしたね・・

"P"はポインタ変数の中身
"*P"はポインタ変数自体のアドレス・・かな

どうもありがとうございました

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 14:13
by ねこ
<この場合はポインタのポインタと言う表現は不適切でしたね・・
そもそもポインタのポインタには「ダブルポインタ」という名称があります「int** PP;」のような。

<"P"はポインタ変数の中身
Pはアドレス
<"*P"はポインタ変数自体のアドレス・・か
*PはPが指すメモリへのアクセス方法であり、ポインタ変数自体のアドレスなら「&P」

なんか予想ですが・・・
int* P;
*P = 1;
とか出来るようなイメージ持ってませんか?
ポインタ変数ってのはアドレス保持するだけですよ。

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 15:13
by チルチル
今まで*Pにはポインタ変数自体のアドレスが入っていると解釈していましたが、違うんですかね・・
確か通常変数に*を付けるとアドレスを変えられると思ってたのですが・・

しかし・・
int ***P;とか
int ****P;みたいに続いていくのだろうか・・

そういう期待は無い事もないですね・・
むしろ
int i;
i=アドレス;
とかできたら良いのにな~
とは思いますね・・
何かグラフィックハンドルと混同してますね・・

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 16:13
by ねこ
<今まで*Pにはポインタ変数自体のアドレスが入っていると解釈していましたが、違うんですかね・・
<確か通常変数に*を付けるとアドレスを変えられると思ってたのですが・
*を付けるのはポインタ変数の実体にアクセスするだけです。ダブルポインタとかと混同してないかな・・・

<int ***P;とか
<int ****P;みたいに続いていくのだろうか・
仕組みが良いかは置いといて、動的配列の確保時には使います。
二次元配列ならダブルポインタ、三次元配列ならトリプルポインタ・・・・と、続きます。
後はポインタ変数を渡して参照先を関数内で作る場合はダブルポインタで渡す等、
ポインタで1冊本が書けると言われるほど用途は様々です。

まぁとりあえず自分でどうこう考えるとヒープメモリ触ったり、解放しない領域作ったりする危険性もあるので
ポインタとメモリについての解説サイトを見たり、本を見たりして徐々にメモリの使い方の幅を広げていけばいいんじゃないかなと。
ゲーム作りの過程で色んな人のソース見てたらそのうち嫌でも覚えるよ。

※なお、ここでは32ビット環境での話という事で。

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 18:09
by kazuoni
>int i;
>i=アドレス;
>とかできたら良いのにな~

これができてしまうと、プログラムがものすごいことに・・・。
っというか、変数とアドレスの区別がなくなるので、
今変数iの持っている数値がアドレスなのかポインタなのかを
別途に記憶しておかないといけなくなり、

・・・

・・・結局はint * ですね。^^;

Re:ポインタの初期化について

Posted: 2009年7月29日(水) 19:39
by チルチル
う~んポインタは奥が深いですね・・
とりあえず慣れるまで*Pに代入はしないようにします