質問: c言語に関してです。 ポインタは配列として使用出来ますが、通常の配列とは何が違うのでしょうか? 例えば char str[]="test"; と、 char *p="test"; は同じではない
回答: > ポインタは配列として使用出来ますが 誤り。 Cでは配列をポインタを用いて操作するために、表記上の約束としてポインタptrと整数値iについて ptr[i] と *(ptr+i) が等価であることにし、また配列の名前のシンボルは通常配列の先頭要素へのポインタを返すという規則を設けてはいる。 特に後者が「ポインタは配列」だという誤解を生むのだろうけど、きちんと考えればいずれも「ポインタが配列として使用できる」ということではない。配列を示すのにポインタを使う、だけ。ポインタはある「場所」を指し示すものでしかない。 char str[]="test"; test+\0が5文字分なので、要素数5の配列strを確保し、そこに文字列(=文字の配列)"test\0"をコピーする char *p="test"; ポインタ変数pは、プログラムのデータエリアに予め格納されている文字列(=文字の配列)"test\0"の先頭アドレスを指すこととする 同じなのは、strもpも指している先が"test"という文字列になっているということだけ。意味は全然違います。 具体的に違いを示せば、 p="test2"; /* 可能 */ str="test2"; /* 文法的にエラー */ p[0]='a'; /* 一般にエラー(システムによる) */ str[0]='a'; /* 可能 */ p=str; /* pがstrそのものを指すようにする */ p[0]='b'; /* 可能。pはポインタなので、この辺の振る舞いは指し示す先によって変わる */ int size,size2; size = sizeof(p); /* sizeofは変数の占めるメモリーの大きさを返す演算子。ポインタ変数の大きさがsizeに設定される */ size2 = sizeof(str); /* size2は配列の要素数によって変わる */ if( size==size2){ printf("配列とポインタは同一サイズ"); /* 多くの場合これは表示されない。もちろんsize==sizeになる要素数はあり得る */ }