読者です 読者をやめる 読者になる 読者になる

そうそうC言語には多次元配列という楽しい要素があった

c/c++

odzさんのをみて「配列とポインタ - odz buffer」反応。
さて、何が楽しいのかというと自分が楽しいだけです。
すみません。
で、最近の言語は多次元配列を持っておらず、
単に「配列の配列」で処理している。C言語もarray of arrayです)
これが多次元配列と何が違うのかというと、
多次元配列はメモリに連続的に領域を確保している。
一方、単なる配列の配列は単に配列の参照を持っているだけなのでメモリに連続的に存在しているとは限らない。


この多次元配列という存在、

int a[10][10];

などと宣言して関数に渡そうとすると以下のような宣言をしなければならない。

void func(int a[][10])
{

void func(int (*a)[10])
{

要するに連続しているメモリのどこからどこまでが最初の次元の幅なのか、
がわからないとならないのでこうなっている。

そのため、通常の(幅が定まらない)ポインタに対しp[1][1]などとアクセスすることはできない。
最初の次元の幅が確定しないため、どこを指して良いかわからないからである。


ついでに、C言語の多次元配列は

5[1[a]]
とか
5[a[1]]



とか変態的な記述でもアクセスできる。
ただ変態性しかないけど。

下線部をきむら(K)さんとodzさんの指摘をうけて追記修正。(うまくinsが適応されないところがあるけど……)

char *s = "abc";

char s[] = "abc";

はsに対して代入を試したりするとわかりやすいですね。