ポインタさん

らすとさん
記事: 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 回目 ]

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

Re: ポインタさん

投稿記事 by ISLe » 12年前

配列とポインタは別物ですよ。
文法上の互換性があるというだけです。

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

Re: ポインタさん

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

あれ?そうなんですか?
またなにか勘違いをしているみたいです。
[n]はポインタ的な役割をしているものだと考えていました。

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

Re: ポインタさん

投稿記事 by ISLe » 12年前

らすとさん さんが書きました:[n]はポインタ的な役割をしているものだと考えていました。
添字演算子が何に掛るかという点において別モノということです。
最終的にはアドレスに掛るのですが、そこに辿り着く手順が異なるというか。

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

Re: ポインタさん

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

同じものに見えるし、同じように使える場合もあるけれど、本当は違うし、同じ様に使えない場合もあるということですか。
配列変数の場合は先頭のアドレスx[0]に足し算をしているとお聞きしました。
ポインタの場合は直接アドレスの指定?なのですかね。
訂正ありがとうございます。
もう一度読み返してみたいと思います。

追記
[tab=30]本来abc[0]とabc[1]は別のものだけれど、ポインタで関連付けてとても使いやすくしてくれている、ということですか。

これがおかしいんですね。失礼しました。
最後に編集したユーザー らすとさん on 2013年8月08日(木) 21:51 [ 編集 1 回目 ]

アバター
へろりくしょん
記事: 92
登録日時: 15年前

Re: ポインタさん

投稿記事 by へろりくしょん » 12年前

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

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

多分
これはちょっとどうでしょうか、今ひとつ意図が不明です。

C言語の配列とは単に、要素型が連続したメモリ空間に並んでいる事を保証する。 ただそれだけのものです。
また、添え字演算子とは、ポインタ演算のシンタックスシュガーに過ぎません。
本来 *(abc + 0); と書くべきところを、abc[0]; と書けますよ。 という便利なおまけ機能です。
ですから、*(abc + 0) と *(0 + abc) が等価であると同様に、abc[0] と 0[abc] もまた等価です。

突き詰めて言ってしまえば、式中に現れた配列型は、全てただのポインタです。
C言語において、配列の要素にアクセスするための機能は存在しません。

char hoge[10];
((int*)hoge)[1] = 10;
というコードを考えてみると、よく分かりますね。


ついでに、配列添え字演算子と配列宣言子は別物です。
そして、基本的に配列の宣言は、
型 配列名 [ 0より大きい汎整数定数式 ] = 初期化子; となります。
つまり、要素数0の配列は宣言できません。

要素数が不明の配列は宣言出来ますが、その場合は不完全型となります。
完全なオブジェクト型とするためには、後の宣言で要素数を指定する必要がありますが、
その場合もやはり0より大きく無ければなりません。

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

Re: ポインタさん

投稿記事 by ISLe » 12年前

へろりんご さんが書きました:突き詰めて言ってしまえば、式中に現れた配列型は、全てただのポインタです。
きちんと理解しているひとにはこの場合の「ポインタ」が具体的に何を表しているのか判断できますが、理解があいまいなひとは「あの宣言するやつと同じもの?」みたいに混同しがちだと思います。
けっきょく正しく伝わらない。