2004年8月20日
#include <stdio.h>
/* 関数において char * とchar [] は同意 */
void hogef(char *, int size);
void fugaf(char [], int size );
int main(int argc, char * argv[]) {
char hoge [] = { 'a','b','c'};
hogef(hoge, 3);
fugaf(hoge, 3);
}
void hogef(char *ary, int size) {
int count = 0;
printf("hogef\n");
for (; count < size; count++) {
/* data */
printf("point:%c:", *(ary + count));
/* pointer */
printf("%x\n", (ary + count));
}
}
void fugaf(char ary [], int size ) {
printf("fugaf\n");
int count = 0;
for (; count < size; count++) {
/* data */
printf("point:%c:", *(ary + count));
/* pointer */
printf("%x\n", (ary + count));
}
}
何故、関数の引数においてchar *とchar []が等価であるかというと、言語仕様で、添え字付き配列は、ポインタのオフセットでかけるからである。巷の入門書には書いていないかもしれないが、カーニハン本にはちゃんと書いてあるので基礎だろう。
char *hoge
char zzz = "HELLO";
hoge =&zzz;
とポインタを定義したならば、ポインタは*hogeで実体(HELLO)を表現できる。またhoge[1]のように、ポインタを配列のように記述できる。関数の引数として配列を渡した場合、プログラマが配列として書いても、ポインタでかいてもポインタとして認識する。
char ary[6] = "HELLO";
ついでに上記のようにary[6]と配列を定義しているが、これも*(ary + 1)などのようにアクセスできる。
つまり、ポインタと配列は相互置換が可能である。ただポインタは変数であるが配列ではない。