IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

C 言語の配列について

僕の理解も相当間違ってたみたいですね

「 *s 」と「 s[] 」の違い - IT戦記
書いてよかった><
書かぬは一生の恥になるところでしたね!

だいたい分かった気がする

違ってたらきっと誰かが突っ込んでくれる><

配列

ポインタはキモくなくて、配列がキモいってことが分かった。

  • あまちゃん配列は式の中に置くと「一部の例外」をのぞいてその場で「先頭要素のポインタ」の値として扱われるよ
  • ひとちゃん: 式じゃないところってどこ><
  • あまちゃん: 宣言ぐらいじゃね
  • ひとちゃん: でも宣言の中で値って使う?
  • あまちゃん: 基本どこでも先頭要素のポインタを指すってことでいいのかもね。(知らない
  • ひとちゃん: へー
  • あまちゃん: 結局「一部の例外」が大事なんじゃね?
  • ひとちゃん: 例外って何よ
  • あまちゃん: sizeof されるとき、 & 演算子でアドレスを取られるとき
  • ひとちゃん: へー。例外ねー
sizeof されたとき
  • あまちゃん: まず、 sizeof されたときの話をするよ
  • ひとちゃん: まじでか!?それはすげーな!
  • あまちゃん: いやまだ何も言ってないよ
  • ひとちゃん: お、おう;
  • あまちゃん: 先頭要素のポインタだったら char a[10]; の sizeof(a) は 10 にはならないじゃん
  • ひとちゃん: まじでだ
& 演算子
  • あまちゃん: 僕は配列に対して & 演算するまで、本当に配列型というものが存在するとは信じられなかったんだ
  • あまちゃん: どうせ、お前ポインタなんだろ?って感じで
  • あまちゃん: でも、これをやってみてすべてが納得だったよ。配列型って存在するんだー!ってなったよ
  • ひとちゃん: ごくり
  • あまちゃんint a[10]; があるとき &a ってどうなる?
  • ひとちゃん: どうなるんだろう。 a と同じ値になりそうだな
  • あまちゃん: 値は同じになるけど、型は違う。 a の型は char* だけど &a の型は char(*)[10] という型になる。
  • あまちゃん: 式の中の a は先頭要素のポインタであって、配列のポインタではない
  • ひとちゃん: ん?
  • あまちゃん: 型が違うから &a + 1 と a + 1 は全然違うよね。配列という集積型があるからこそ、こういうことがおこる。
  • あまちゃん: もちろん、 int (*b)[10] として、最初から配列のポインタを作ることも可能だ。
  • ひとちゃん:うーん

あと

配列は「左辺値」だが、「変更可能な左辺値」ではない。
だから、 a++ みたいなことや、 a = 1 みたいなこともできない。でも &a はできる。
左辺値とは、参照を持つ値(直値ではない値)ということでいいのかな?ここはよく分かっていない。
ここらへんは、 const 付きのポインタとの差がないので、あまりキモくはない

調べたサイト