どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。
1.配列の宣言には
int a[];
a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、
int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。
この時なぜ3が勝手に代入されないかがわからない
2.数字とメモリ
int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2
int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5
ここまで文字列以外の配列は添え字だけで管理されている。
3.文字列とポインタ
char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。
char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。
sは&s[0]とも表現できるように、最初のアドレスを指し示している。
char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。
文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか?
また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は
char s[2][2] = {{"abc","def"},{"ghi","jkl"}};
となるかと思いますが
char *s[2][2] = {{"abc","def"},{"ghi","jkl"}};
とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?
お礼
>レアケースでも矛盾が生じる場合 この部分は考えていませんでした。矛盾が生じたらだめですよね。まだあたったことはないですが、覚えておく必要がありますね。 >s[1][1]は文字である 非常に感動しました。今までも解釈だとなぜアドレスを示したりポインタを示したのかがわからなかったのが意味を持ちました。
補足
初心者の僕が言うのもあれですが >言語の中で、これほどアドレスを意識するC言語は、ある意味原始的とも言える。 は非常にその通りですが、個人的にはすごくいい部分だと思っています。cpuを意識するレベルになるのは嫌ですが。何というか、しっかりしている感じ、文字列とそのほかがつながっている部分も割と好きです。 本題からずれてしまいすみません。