Shammer's Philosophy

My private adversaria

配列とポインタその2

C言語では、配列はポインタとして使うことができる、というか配列名はその配列の先頭要素のアドレスと同義。配列とポインタその1 - Shammerismでも多少言及したけれども。
つまり、

 ポインタ=配列の先頭要素のアドレス

というのはC言語の仕様。これを確認する方法に変換仕様「%p」を使う方法がある。
これを使うと、メモリアドレスを16進数で出すことが可能。

main(){
 char array[10];
 printf("array = %p\n", array);
 printf("&array=%p\n", &array);
 return 0;
}

この実行結果は、

array = 0xbffff8ab
&array= 0xbffff8ab

という感じになる。
この結果から、配列の先頭要素の参照と配列のメモリアドレスが同じということがわかる。
参照とポインタの違いがよくわかっていなかったがだんだん見えてきた。
参照はあくまで変数のメモリアドレスのことで、ポインタは他の変数のメモリアドレスを格納するための変数。
Cの場合、変数以外に関数ポインタというのがあるらしいから変数のメモリアドレスというわけでもないが。


基本的にC言語の関数はすべて値渡しだ。
が、値渡しだと大きな配列を関数間で渡すときに、パフォーマンス劣化を招く。
こうしたことを考えて、配列は参照で渡されるようになっているのだろうか。
参照渡しであれば、各要素をコピーする必要がなく、値渡しに比べて低コストですむ。
Javaでいうと、クラスを引数にするか、プリミティブ型を引数にするか、という話だ。
昔はここで悩んだ時期もあったなぁ・・・参照というのがよくわからなかった。
(もちろん今はそんなことはないが)