<<戻る

2004年8月20日

関数においてchar *とchar []という引数は同意である。

#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)などのようにアクセスできる。

つまり、ポインタと配列は相互置換が可能である。ただポインタは変数であるが配列ではない。