ポインタさん

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

ポインタさん

投稿記事 by らすとさん » 12年前

ポインタの勉強始めてどのくらいたったのかなぁ・・・

CODE:

int x,y;
int *p;
p = &x;     //pにxのアドレスを記入する。
y = p;       //これだとpをyに代入することになる。
y = *p;      //pに書かれたアドレスにあるものをyに代入する。
これはなんとなく解ってきました。
しかし配列変数の場合の理解ができないです。

CODE:

int x[10];
int y;
int *p;
p = x;        //pにxの先頭のアドレスを代入する。何故&がつかないのか?
y = p[5];  //ここに書かれたアドレスにロッカーの0番があり、それの5番にあるものをyに代入する。*は何故必要ないのか?
んー・・・これでいいのでしょうか?
これだと普通にy = x[5];と書いた時と変わらないですよね。
他にも配列変数z[10]があった場合に参照するアドレスをxとzに切り替えながら使えるってことでしょうか。
配列になると一気に混乱してしまいます。

追記
もしかしてこれがないと出来ないことというのは少なく、もっと沢山のものが出てきたときにコードが複雑になり過ぎないようにする為なのでしょうか?
最後に編集したユーザー らすとさん on 2013年8月08日(木) 17:41 [ 編集 3 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 15年前

Re: ポインタさん

投稿記事 by みけCAT » 12年前

つかぬことをお伺いしますが、「[tab=30:29d9mw4f]」とは何ですか?

【追記】
「[tab=30:1lh9efwj]」に置換しましたね。私には意味がわからないということには変わりありません。
codeタグの仕様(バグ?)? テスト

CODE:

#include 
int main(void) {
	return 0;
}
最後に編集したユーザー みけCAT on 2013年8月08日(木) 17:37 [ 編集 1 回目 ]
理由: 最新の情報に対応

アバター
みけCAT
記事: 6734
登録日時: 15年前

Re: ポインタさん

投稿記事 by みけCAT » 12年前

らすとさん さんが書きました:他にも配列変数z[10]があった場合に参照するアドレスをxとzに切り替えながら使えるってことでしょうか。
この用途はありますね。
例えば基数ソートをするとき、入力の配列と出力の配列をポインタで示して切り替えながら処理をしたことがあります。

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

Re: ポインタさん

投稿記事 by らすとさん » 12年前

日記を書いた時にタブインデント挿入を押した際に挿入されたタグ[tab=30]がこうなっていました。
使い方が解らないので消します。
みけCAT さんが書きました:「[tab=30:1lh9efwj]」に置換しましたね。私には意味がわからないということには変わりありません。
それは大変失礼しました。そういった物言いをされるほどの重大なミスをしているとは思いもしませんでした。
最後に編集したユーザー らすとさん on 2013年8月08日(木) 18:12 [ 編集 2 回目 ]

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

Re: ポインタさん

投稿記事 by らすとさん » 12年前

なるほど、使い方によって色々出来るものなんですね。
ありがとうございます。

ISLe
記事: 2650
登録日時: 15年前

Re: ポインタさん

投稿記事 by ISLe » 12年前

配列名が代入の右辺にあるときはその配列の先頭要素を指すポインタとみなされます。
&x[0]と同じ意味になります。
&xという記述もありますが、その場合配列全体に対するアドレスとなります。
つまり型が異なります。
らすとさん さんが書きました:他にも配列変数z[10]があった場合に参照するアドレスをxとzに切り替えながら使えるってことでしょうか。
配列になると一気に混乱してしまいます。

追記
もしかしてこれがないと出来ないことというのは少なく、もっと沢山のものが出てきたときにコードが複雑になり過ぎないようにする為なのでしょうか?
ゲームのマップの切り替えとかあらゆるところで使いますね。
mallocで確保したメモリブロックは無名の配列なので同じように扱うことになります。
最後に編集したユーザー ISLe on 2013年8月08日(木) 18:53 [ 編集 1 回目 ]

アバター
LisetteLander
記事: 147
登録日時: 14年前

Re: ポインタさん

投稿記事 by LisetteLander » 12年前

一応・・・
C言語で配列というのは、添字演算子[]というものを使ってポインタが指しているアドレスから後ろに並んでいる要素にアクセスできる機能です。
本来メモリ上に並んでいる要素に順にアクセスするにはイテレータを作ったりする必要があるのですが、これを添字演算子がうまいぐあいに簡単にしてくれてるということです。

つまり
int abc[0];
というのと
int* abc;
というのは同じです。
無論、
abc=アドレス
*abc=アドレスが指しているメモリの中身
というのも同じです。

多分

アバター
みけCAT
記事: 6734
登録日時: 15年前

Re: ポインタさん

投稿記事 by みけCAT » 12年前

らすとさん さんが書きました:
みけCAT さんが書きました:「[tab=30:1lh9efwj]」に置換しましたね。私には意味がわからないということには変わりありません。
それは大変失礼しました。そういった物言いをされるほどの重大なミスをしているとは思いもしませんでした。
それは大変失礼しました。そういった物言いをされるほどの重大なミスを指摘しているとは思いもしませんでした。

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

Re: ポインタさん

投稿記事 by らすとさん » 12年前

ISLe さんが書きました:配列名が代入の右辺にあるときはその配列の先頭要素を指すポインタとみなされます。
&x[0]と同じ意味になります。
&xという記述もありますが、その場合配列全体に対するアドレスとなります。
つまり型が異なります。
コメントありがとうございます。
その場合に限って&x[0]とは書かなくても良いよってことなんですね。
やっとその部分の意味が解りました。
ISLe さんが書きました:ゲームのマップの切り替えとかあらゆるところで使いますね。
mallocで確保したメモリブロックは無名の配列なので同じように扱うことになります。
マップはそういう風に切り替えているのですね。
とても大きな3次元配列map[mapid][x][y]を作っているなんて想像していましたので、目から鱗が落ちる思いです。
動的配列を調べている最中にmallocという単語を見かけた気がします。
あれはメモリを確保する命令だったんですね。ありがとうございました。

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

Re: ポインタさん

投稿記事 by らすとさん » 12年前

LisetteLander さんが書きました:一応・・・
C言語で配列というのは、添字演算子[]というものを使ってポインタが指しているアドレスから後ろに並んでいる要素にアクセスできる機能です。
本来メモリ上に並んでいる要素に順にアクセスするにはイテレータを作ったりする必要があるのですが、これを添字演算子がうまいぐあいに簡単にしてくれてるということです。
つまり
int abc[0];
というのと
int* abc;
というのは同じです。
無論、
abc=アドレス
*abc=アドレスが指しているメモリの中身
というのも同じです。

多分
コメントありがとうございます。
本来abc[0]とabc[1]は別のものだけれど、ポインタで関連付けてとても使いやすくしてくれている、ということですか。
イテレータという言葉もさわりだけ調べましたが、場合によっては構造体等にも絡んできそうですね。

らすとさん
記事: 5
登録日時: 13年前
住所: 福岡

Re: ポインタさん

投稿記事 by らすとさん » 12年前

みけCATさん
それなら最後に仰った言葉
みけCAT さんが書きました:私には意味がわからないということには変わりありません。
これは不要ですね。当てこするようなもの言いはやめてくださいね。不快です。