C言語のポインタと配列
どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。
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自身を表せるようになるのでしょうか?
お礼
ご回答ありがとうございます。スペースを入れる方法は気づいていたのですが、やはりそれしかないですかね…。とても参考になりました。もう少し待ってこの質問を閉じようと思っています。