ポインタを理解する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#31

投稿記事 by ISLe » 6年前

int型の変数の記憶域には、int型の値を格納でき、変数名で記憶域にアクセスできる。
int*型の変数の記憶域には、int*型の値を格納でき、変数名で記憶域にアクセスできる。
まず理解してもらいたいのはこれだけのことなんですけどね。

かずま

Re: ポインタを理解する

#32

投稿記事 by かずま » 6年前

3D_3D さんが書きました: 図を書いて下さりありがとうございます。とてもわかりやすかったです。

さらに質問ですが、アドレスが代入されるとはどういう意味でしょうか?
とてもわかりにくかったようですね。
「b = &b; を実行したときのメモリ」と書いてしまいましたが、
「b = &a; を実行したときのメモリ」の間違いだということは理解されていますよね。
不定だった b のメモリが、a のアドレスに変わりましたよね。
これが、「アドレスが代入される」という意味です。

「a = 6; を実行したときのメモリ」のところでは、
不定だった a のメモリが、6 という値に変わりましたよね。
これが、「6 が代入される」という意味です。
3D_3D さんが書きました: a=6 とするとaの領域に6が代入されますが、 b= &a は bの領域にaのアドレス( 0x0047fd08 )が代入されるとは b = 0x0047fd08 と言う意味ですか?
いいえ、違います。

次のプログラムを Cコンパイラでコンパイルすると、警告メッセーが出るはずです。
C++コンパイラだと、エラーメッセージが出ます。

コード:

#include <stdio.h>
 
int main(void)
{
    int *b;
    b = 0x0047fd08;
    return 0;
}
b の型は、int * です。0x0047fd08 の型は、int です。
型が異なるから、コンパイラは文句を言ってくるのです。

b = &a; の場合、b の型は、int * です。&a の型も、int * です。
同じだから、代入できるのです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#33

投稿記事 by softya(ソフト屋) » 6年前

色んな人が書くことで逆に3D_3Dさんを困らせている気がするので私はしばらくだまります。
出来るだけ誰か一人の方針に絞って説明をして、それをフォローする形で進めてください。
3D_3Dさんが理解する筋道を作る事が最優先だと考えます。

【補足】
それならこれが良いと案がないのが私が黙る理由です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
三郎
記事: 17
登録日時: 8年前

Re: ポインタを理解する

#34

投稿記事 by 三郎 » 6年前

横から口を挟んで申し訳ありませんが皆さんの議論を見ていますと考えさせられます。
私はソフトに関して(他の事も)ド素人でポインターの事はよく分かりません。
だから使いません。
しかし参考になるソフト(ソースリスト)、考え方を自分のソフトに書き加えるような場合、ポインターの部分を、まる写しにして加えています。
このようにしてコンパイラーのエラーが出なければ、また作成したソフトが可笑しな動きをしていなければそれで良しとして、逃げています。
これは自分の作ったソフトが自分で使うだけの代物で、他人に見せたり、それほど高性能な機能を必要としないからです。

そこで皆さんに質問しますが、
私の認識(勝手な認識、多分間違っているかも)

1.ポインターを使ってもアプリの実行速度は、さほど速くならない?。
2.ポインターを使ってもメモリー等の節約にさほど貢献しない?貢献してもメモリ等の単価が下がっている昨今あまり重要ではない?。
3.ポインターを使うとアプリのソースがスマートに書ける?。ソースリストの拡張性、汎用性が向上する、そして作業の能率が向上する。
4.ポインタを苦労して理解さえすれば、分かりやすいソースが書ける。ソースコードも小さくなる。
5.ポインターを理解していなければ計算機の学校を卒業できず、ソフト技術者として、生活していけない。


このような事なのかなと思っていますが、ポインターを使うメリットは何でしょうか?

無理して使う必要があるのでしょうか?
もし 1.項の実行速度が上がるなら無理して勉強して、使ってみたく思います宜しくお願いします。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#35

投稿記事 by へにっくす » 6年前

三郎 さんが書きました:横から口を挟んで申し訳ありませんが皆さんの議論を見ていますと考えさせられます。
別トピックとしてあげてほしいかも。とりあえず、
三郎 さんが書きました:無理して使う必要があるのでしょうか?
に関してだけ。無理して使う必要はありません。何かしら代替となるようなモノで逃げられるなら、それで構わないです。
ただその都度いちいち結果優先でコーディングするということは、思った通りの結果になるまで、何度も試行錯誤することになります。
ポインターに限らず、基本というか仕組みを理解しておけば、結果を想定してコーディングするだけなので、時間をとられずに済みます。
理解しておくと言うのは大事なことですよ。
written by へにっくす

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#36

投稿記事 by へにっくす » 6年前

うーん…ここまで白熱するとは思いませんでした
で、何だか出尽くした雰囲気が出てるので、前のトピック(http://dixq.net/forum/viewtopic.php?f=3&t=13591)の、
Player_Initで、&playerならokだがplayer_t *player;にしたときplayerだとうまくいかない理由の答えをちらっと述べます。

まずポインタの概念は、入れる箱を用意するという感じ。
int a = 0;
int型の変数でこれは実体を示している
int *p = NULL;
int型の実体の場所を示す変数。
なので実体の場所を示す変数に場所でないものを入れるのはおかしい。だから
int *p = 0x1000;
というのはダメで、
int *p = (int*)0x1000;
というふうにキャスト変換しないといけない。
&をつけるとつけられた変数のアドレスを返すので
int *p = &a;
これは事実、存在するアドレスを代入してますよね。ここまでは大丈夫かな?
なので前のトピックの
struct player_t player;
Player_Init(&player);
はok。
では
struct player_t *player;
としたときは
Player_Init(player);
としますがこれって実体があることが保証されてますかね?
されていないですよね。すくなくとも、Player_Initに渡す前に、
playerに実体のある変数のアドレスを渡さなければなりません。

これがうまくいかない理由だと思いますがどうでしょう?
オフトピック
この独り言が一番近かったので、関数の受け渡し方と述べたのですけどね。。
3D_3D さんが書きました:思いついたのは
・どのアドレスに割り振られるかわからないうちに初期化されるから、かなと思いました。
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#37

投稿記事 by softya(ソフト屋) » 6年前

今後どの勉強方法で行くのかは、3D_3Dさんに決めていただきたいと思います。
なので、とりあえず3D_3Dさんの意見を待ちたいです。

【補足】
私はCASL2アセンブラで根本から理解するという道も検討しておりました。
遠回りなんですけどね。

【補足追記】
> 三郎さんへ
別トピックにして頂けると嬉しいです。

カンタン解説:ポインタは大抵は配列の添字で代用可能です。
ただ、配列の添字をポインタ代わりに置き換えを考えれる人はポインタも理解できると思います。

ポインタが必須なのは大きな領域を動的確保するとぐらいでしょうか。
それとポインタが高速性を発揮するのは、ソートなどの分野です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: ポインタを理解する

#38

投稿記事 by Ryo » 6年前

こんなイメージでも

int a; // 家a

int *p; // 住所録p(新品)

p = &a; // 住所録pに、家aの"住所"を書き込む

a = 310; // 家aにサトーさんが住む

*p= 310; // 住所録pにかかれた住所(=家a)にサトーさんが住む

p = 123; // 住所録pにヒフミさんを住まわせようとして怒られる

p = (int*)123; // 住所録pに"1-2-3"という"住所"を書き込む


//関数引き渡し (Func(char*))
char a; // 家aを建てる
Func( &a ); // aの住所をFuncさんに渡して、結果を送ってもらったりする

char *p; // 新品の住所録
Func( p ); // 新品の住所録の白紙の部分をさして、Funcさんに、この住所に結果を送れと無理を言う


//メモリ確保
int *p,*p2; // 住所録pとp2

p = new int; // 家を建てて、住所録にその住所を書く

p2 = new int[10]; // 10部屋あるアパートを立てる

p2[3] = 510; // 3号室にゴトーさんが住む

p2++; // アパートを一部屋一部屋みていく
// char型の小さなアパートでも、LONGLONGな大きな部屋の億ションでも、一部屋ずつ

delete p; // 住所録に書かれた家を壊す(壊したあとに家に人を住まわせようとすると怒られる)
delete[] p2;    // 集合住宅破壊用

p= NULL; // 住所録に消しゴムをかけて住所を消しておく

かずま

Re: ポインタを理解する

#39

投稿記事 by かずま » 6年前

三郎 さんが書きました: このような事なのかなと思っていますが、ポインターを使うメリットは何でしょうか?
ポインタを使わないと、ファイル操作も、文字列操作もできません。
コマンドライン引数も使えません。
画像データも扱えません。

printf は、int printf(const char *format, ...);
(C99 からは * に restrict がつきますが) と宣言されていて、
第1引数にポインタを要求します。

配列は、暗黙のうちにポインタに変換されて要素にアクセスします。
a は、*(a + i) のことなんです。

関数は、暗黙のうちにポインタに変換されて関数を呼び出します。
printf("hoge") は、(&printf)("hoge") のことなんです。

ポインタを使わずに実用的なプログラムを書くのは不可能です。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#40

投稿記事 by Rittai_3D » 6年前

すいません、部活で返信ができませんでした。

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:うーん…ここまで白熱するとは思いませんでした
で、何だか出尽くした雰囲気が出てるので、前のトピック(http://dixq.net/forum/viewtopic.php?f=3&t=13591)の、
Player_Initで、&playerならokだがplayer_t *player;にしたときplayerだとうまくいかない理由の答えをちらっと述べます。

まずポインタの概念は、入れる箱を用意するという感じ。
int a = 0;
int型の変数でこれは実体を示している
int *p = NULL;
int型の実体の場所を示す変数。
なので実体の場所を示す変数に場所でないものを入れるのはおかしい。だから
int *p = 0x1000;
というのはダメで、
int *p = (int*)0x1000;
というふうにキャスト変換しないといけない。
&をつけるとつけられた変数のアドレスを返すので
int *p = &a;
これは事実、存在するアドレスを代入してますよね。ここまでは大丈夫かな?
なので前のトピックの
struct player_t player;
Player_Init(&player);
はok。
では
struct player_t *player;
としたときは
Player_Init(player);
としますがこれって実体があることが保証されてますかね?
されていないですよね。すくなくとも、Player_Initに渡す前に、
playerに実体のある変数のアドレスを渡さなければなりません。

これがうまくいかない理由だと思いますがどうでしょう?
オフトピック
この独り言が一番近かったので、関数の受け渡し方と述べたのですけどね。。
3D_3D さんが書きました:思いついたのは
・どのアドレスに割り振られるかわからないうちに初期化されるから、かなと思いました。
なるほど。実体があることが保証されてないからエラーが出たのですか。ということは「構造体の実体があることが保証されていないうちに初期化処理をしようとしてエラー落ちしてしまう」ということでしょうか?
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#41

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:今後どの勉強方法で行くのかは、3D_3Dさんに決めていただきたいと思います。
なので、とりあえず3D_3Dさんの意見を待ちたいです。

【補足】
私はCASL2アセンブラで根本から理解するという道も検討しておりました。
遠回りなんですけどね。
自分としては、もうすこし勉強して、どうしても理解できないようならばパターンで覚えようと考えております。

今はもう少しポインタを勉強したいと思います。
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#42

投稿記事 by Rittai_3D » 6年前

>>Ryo様

返信ありがとうございます。
Ryo さんが書きました:こんなイメージでも

コード:

int a; // 家a

int *p; // 住所録p(新品)

p = &a; // 住所録pに、家aの"住所"を書き込む

a = 310; // 家aにサトーさんが住む

*p= 310; // 住所録pにかかれた住所(=家a)にサトーさんが住む

p = 123; // 住所録pにヒフミさんを住まわせようとして怒られる

p = (int*)123; // 住所録pに"1-2-3"という"住所"を書き込む


//関数引き渡し (Func(char*))
char a; // 家aを建てる
Func( &a ); // aの住所をFuncさんに渡して、結果を送ってもらったりする

char *p; // 新品の住所録
Func( p ); // 新品の住所録の白紙の部分をさして、Funcさんに、この住所に結果を送れと無理を言う


//メモリ確保
int *p,*p2; // 住所録pとp2

p = new int; // 家を建てて、住所録にその住所を書く

p2 = new int[10]; // 10部屋あるアパートを立てる

p2[3] = 510; // 3号室にゴトーさんが住む

p2++; // アパートを一部屋一部屋みていく
// char型の小さなアパートでも、LONGLONGな大きな部屋の億ションでも、一部屋ずつ

delete p; // 住所録に書かれた家を壊す(壊したあとに家に人を住まわせようとすると怒られる)
delete[] p2;    // 集合住宅破壊用

p= NULL; // 住所録に消しゴムをかけて住所を消しておく
イメージがしやすく、分かりやすかったです。newもmalloc()でも同じように扱えると思いますのでやってみます。
初心者です

アバター
三郎
記事: 17
登録日時: 8年前

Re: ポインタを理解する

#43

投稿記事 by 三郎 » 6年前

へにっくすさん返信ありがとうございました。
確かに貴方の言われるように、
「ただその都度いちいち結果優先でコーディングするということは、思った通りの結果になるまで、何度も試行錯誤することになります。
ポインターに限らず、基本というか仕組みを理解しておけば、結果を想定してコーディングするだけなので、時間をとられずに済みます。
理解しておくと言うのは大事なことですよ。」
言われてみればその通りです。分かっているけど中々実行できないものですね、そして私の場合もし理解できても少し経つと忘れてしまうのです(年齢からくる?)
肝に銘じやってみます。

かずまさん、返信ありがとうございました。
私は配列までは、何とか少し分かっていますので、これから勉強すれば、かずまさんの言われる事が少しは理解できるかも分かりません。
有難うございました。


ソフト屋さん私に対する配慮有難うございます。
ポインターの必要理由が理解できない人が非常に多い事が分かり、ネット検索してみましたら次のサイトが見つかりました。
http://d.hatena.ne.jp/kura-replace/20120616/1339856279
ここに書いてある事を読んでみましたら如何に私が無知であったかが分かりました。
レベルの高いプログラムを目指すなら避けて通れないように感じました。

可能な限り勉強してソースを掲示板に張れるようになったら再度教えてほしいと思います。
それまでは皆さんの書かれている物を読ませてもらいます。
有難うございました、お騒がせしました。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#44

投稿記事 by ISLe » 6年前

3D_3Dさんが理解できていない部分と重なるので書いておきます。

ポインタは、アドレス値を複製し代入して使うので、関数の仮引数と同じく、実行時に与えられた値で動作します。

なので、手を加えることなく将来にわたって利用可能なプログラムを書くことができます。

OSが、リリースされたときには存在しなかった未知のアプリケーションソフトを動かせるのもポインタがあるからです。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#45

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:なるほど。実体があることが保証されてないからエラーが出たのですか。ということは「構造体の実体があることが保証されていないうちに初期化処理をしようとしてエラー落ちしてしまう」ということでしょうか?
そういうことです。
ポインタを宣言するということは、場所(アドレス)を示すだけで、実体を示しているわけではないことにご注意くださいね。
written by へにっくす

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#46

投稿記事 by Rittai_3D » 6年前

すいません。様々な理由がありまして、返信できませんでした。

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:
3D_3D さんが書きました:なるほど。実体があることが保証されてないからエラーが出たのですか。ということは「構造体の実体があることが保証されていないうちに初期化処理をしようとしてエラー落ちしてしまう」ということでしょうか?
そういうことです。
ポインタを宣言するということは、場所(アドレス)を示すだけで、実体を示しているわけではないことにご注意くださいね。
わかりました。実体でなくポインタを示すのですね。
初心者です

Lawliet
記事: 12
登録日時: 6年前

Re: ポインタを理解する

#47

投稿記事 by Lawliet » 6年前

>3D_3Dさん

なんだか回答の対応ばかりで受け身になってしまったような気がします。
なのでソフト屋さんも言いっているように方針を決めて状況を整理したほうがいいと思います。
3D_3D さんが書きました:
softya(ソフト屋) さんが書きました: 今後どの勉強方法で行くのかは、3D_3Dさんに決めていただきたいと思います。
なので、とりあえず3D_3Dさんの意見を待ちたいです。

【補足】
私はCASL2アセンブラで根本から理解するという道も検討しておりました。
遠回りなんですけどね。
自分としては、もうすこし勉強して、どうしても理解できないようならばパターンで覚えようと考えております。

今はもう少しポインタを勉強したいと思います。
この返信だけでは不十分な感じもします。
「どのように勉強していくか」を聞いているのに対し「もうすこし勉強して」と返信されているので、
「どのように」というのをしっかり明記した方がいいと思います。

もし決めることができないならばその旨を伝え、
このトピックスの最初のように今現在のポインタの理解度を示して
わからないところを一つづつやっていくというのもいい方法だと思います。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#48

投稿記事 by ISLe » 6年前

へにっくす さんが書きました:ポインタを宣言するということは、場所(アドレス)を示すだけで、実体を示しているわけではないことにご注意くださいね。
ポインタ型の変数を宣言すると、場所を示す値を格納する領域が確保されますが、その値が具体的な場所を示しているとは限りません。

特定のオブジェクトが持つアドレスをポインタと呼びますが、その場合のポインタはそのオブジェクトを指すもの(値)です。
オブジェクトは常に記憶域を持つので、場所を示すが実体を示さないという状況はありません。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#49

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:わかりました。実体でなくポインタを示すのですね。
えっと、、上記を言いかえると、ポインタを宣言するということは、実体でなくポインタを示すとなっちゃいますけど?(^^;
ポインタを宣言するということは、実体でなく場所を示す、ですよ。
ISLe さんが書きました:ポインタ型の変数を宣言すると、場所を示す値を格納する領域が確保されますが、その値が具体的な場所を示しているとは限りません。
これがよりしっくりくる。フォローありがとうございます。
ポインタを宣言する、ではなくポインタ型の変数を宣言すると、ですね。

よくポインタ型の変数はNULLで初期化してるけど、これなんかは具体的な場所でないことを示すために使ってますよね
変数の場所(アドレス)はNULLになることがないので(Cの規約でしたっけ?間違ってたらすみません)。
ISLe さんが書きました:特定のオブジェクトが持つアドレスをポインタと呼びますが、その場合のポインタはそのオブジェクトを指すもの(値)です。
オブジェクトは常に記憶域を持つので、場所を示すが実体を示さないという状況はありません。
ポインタについての説明ですね。
ポインタ型の変数についてとは別ですね?
「ポインタを宣言する」とは言わない方がよさそうですね。ごっちゃになってる(^^;

私も言葉でうまく説明できていないあたり、何だか危ないですかね。。。
written by へにっくす

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#50

投稿記事 by Rittai_3D » 6年前

インターネットに繋がりにくいところに居るので返信ができませんでした。

>>Lawliet様

返信ありがとうございます。
Lawliet さんが書きました:>3D_3Dさん

なんだか回答の対応ばかりで受け身になってしまったような気がします。
なのでソフト屋さんも言いっているように方針を決めて状況を整理したほうがいいと思います。
3D_3D さんが書きました:
softya(ソフト屋) さんが書きました: 今後どの勉強方法で行くのかは、3D_3Dさんに決めていただきたいと思います。
なので、とりあえず3D_3Dさんの意見を待ちたいです。

【補足】
私はCASL2アセンブラで根本から理解するという道も検討しておりました。
遠回りなんですけどね。
自分としては、もうすこし勉強して、どうしても理解できないようならばパターンで覚えようと考えております。

今はもう少しポインタを勉強したいと思います。
この返信だけでは不十分な感じもします。
「どのように勉強していくか」を聞いているのに対し「もうすこし勉強して」と返信されているので、
「どのように」というのをしっかり明記した方がいいと思います。

もし決めることができないならばその旨を伝え、
このトピックスの最初のように今現在のポインタの理解度を示して
わからないところを一つづつやっていくというのもいい方法だと思います。
ありがとうございます。まだ自分で方針が決められないのでおっしゃる通りに一つ一つ疑問を解決していくようにしたいと思います。
初心者です

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#51

投稿記事 by ISLe » 6年前

誤った刷り込みが行われるパターン。

コード:

void hoge(int *p);
int i = 10; 
int *p; /* ポインタを宣言します  */
p = &i; /* ポインタに代入します */
*p = 20; /* ポインタが指す変数を書き換えできます */
hoge(p); /* ポインタを渡します */
&iの意味がスルーされポインタを渡すという部分だけが記憶に残りがち。

丁寧に説明するとこんな感じ。

コード:

void hoge(int *p);
int i = 10; 
int *p; /* intへのポインタ型の変数を宣言します  */
p = &i; /* 変数pに、int型の変数iのアドレス(intへのポインタ型の値)を代入します */
*p = 20; /* 変数iのアドレス(変数pに格納されている値)に間接演算子が働くことで変数iの記憶域に対して代入が行われます */
hoge(p); /* 変数iのアドレス(変数pに格納されている値)をコピーして、intへのポインタ型の仮引数に渡します */
ちなみにきちんと理解せず区別できないままだとこんなことに。

コード:

void hoge(int *p);
int i = 10; 
int *p; /* ポインタを宣言します  */
p = &i; /* ポインタにポインタを代入します */
*p = 20; /* ポインタが指す変数を書き換えできます */
hoge(p); /* ポインタをポインタに渡します */
変数の宣言と間接参照の組み合わせを元にして覚えていると思われる。



ヌルポインタはあらゆるオブジェクトの持つアドレスと比較して等しくないことが保証される値です。
それとは別に、初期化されていない一時変数の値は未規定です。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#52

投稿記事 by Rittai_3D » 6年前

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:
3D_3D さんが書きました:わかりました。実体でなくポインタを示すのですね。
えっと、、上記を言いかえると、ポインタを宣言するということは、実体でなくポインタを示すとなっちゃいますけど?(^^;
ポインタを宣言するということは、実体でなく場所を示す、ですよ。
ISLe さんが書きました:ポインタ型の変数を宣言すると、場所を示す値を格納する領域が確保されますが、その値が具体的な場所を示しているとは限りません。
これがよりしっくりくる。フォローありがとうございます。
ポインタを宣言する、ではなくポインタ型の変数を宣言すると、ですね。

よくポインタ型の変数はNULLで初期化してるけど、これなんかは具体的な場所でないことを示すために使ってますよね
変数の場所(アドレス)はNULLになることがないので(Cの規約でしたっけ?間違ってたらすみません)。
ISLe さんが書きました:特定のオブジェクトが持つアドレスをポインタと呼びますが、その場合のポインタはそのオブジェクトを指すもの(値)です。
オブジェクトは常に記憶域を持つので、場所を示すが実体を示さないという状況はありません。
ポインタについての説明ですね。
ポインタ型の変数についてとは別ですね?
「ポインタを宣言する」とは言わない方がよさそうですね。ごっちゃになってる(^^;

私も言葉でうまく説明できていないあたり、何だか危ないですかね。。。
何か勘違いしていたようです。アドレスと実体をごちゃ混ぜにしてしまいました。
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#53

投稿記事 by Rittai_3D » 6年前

いままでポインタを勉強していて、自分には理解できないと思いました。ですので、ポインタを理解するのではなく、パターンで覚えたいと思います。

自分がポインタを理解できるように解説して下さった皆様には本当に悪いと思います。しかし、ポインタを理解するよりもパターンで覚えた方が早いと考えました。

ですので、方針を変えまして、これからはパターンで覚えたいと思います。

身勝手なことを申し上げてしまい、申し訳ありません。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#54

投稿記事 by softya(ソフト屋) » 6年前

パターン法ですが話が進まないみたいので、3D_3Dさんがこういうことをやりたい!とパターンを提示したほうが良いかもしれませんね。
関数に構造体ポインタを渡して関数先で構造体を書き換えたいとか、関数から構造体のポインタを持ち帰りたいとか、関数に配列を渡したいとかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#55

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:パターン法ですが話が進まないみたいので、3D_3Dさんがこういうことをやりたい!とパターンを提示したほうが良いかもしれませんね。
関数に構造体ポインタを渡して関数先で構造体を書き換えたいとか、関数から構造体のポインタを持ち帰りたいとか、関数に配列を渡したいとかね。
シューティングなどのゲームだけでなく、他のことにも使えるように「どのような時にポインタを使うか」を教えていただきたいです。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#56

投稿記事 by softya(ソフト屋) » 6年前

ポインタに関してならアプリでもゲームでも大抵は関係ないです。
ただ、どのパターンを覚えると良いかはパターンで覚えたことがないので私には難しいです。
この状況にはどうしたらよいですか?って事なら答えられるんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#57

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:ポインタに関してならアプリでもゲームでも大抵は関係ないです。
ただ、どのパターンを覚えると良いかはパターンで覚えたことがないので私には難しいです。
この状況にはどうしたらよいですか?って事なら答えられるんですが。
それでは、その都度聞くのはダメでしょうか?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#58

投稿記事 by softya(ソフト屋) » 6年前

疑問に疑問で返しますが、どうなんでしょうか?
パターン暗記法の効能がよく分かっていない私です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#59

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:それでは、その都度聞くのはダメでしょうか?
それがパターンを覚えるってことだと思いますけど。
だから、結果優先でやるということは、思い通りの結果を得るまで試行錯誤することになる、と言いました。

なのでこのトピックの主旨から外れると思いますので、ここはいったん解決にした方がいいかもしれません。
【追記】私が言うことではない気がしたので、上の文言は取り消します。。
最後に編集したユーザー へにっくす on 2013年8月11日(日) 17:18 [ 編集 1 回目 ]
written by へにっくす

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#60

投稿記事 by ISLe » 6年前

パターンで覚えるというのは、ポインタを要求されたときに答える形になるので、どんなときに使うかを考える必要はありません。
なので、パターンで覚えることができても、自ら積極的にポインタを使うことにはほとんど貢献しません。


アドレス演算子(&)を付けると型に*が1個増える
間接演算子(*)を付けると型から*が1個減る
*の数を揃えて使う
というのが基本パターンですね。


例えば自作の関数にポインタを使いたかったら、とりあえず引数の型をポインタにしてしまい、*の数が揃うように適当にコーディングするといった感じになりますね。

閉鎖

“C言語何でも質問掲示板” へ戻る