- ベストアンサー
ポインタについて
下記<コード1>ではエラーが出ないのに、 <コード2>のように変更すると、 ”error C2105: '++' には左辺値が必要です。” とエラーが出ます。 どうしてなのか教えて下さい。 <コード1> char *str_copy(char *d , const char *s){ char *t=s2; while(*d++=*s++) ; return (t); } int main(void) { char s1[128]="ABCD"; char s2[128]="EFGH"; str_copy(s2,s1); <コード2> int main(void) { char s1[128]="ABCD"; char s2[128]="EFGH"; // str_copy(s2,s1); while(*s2++=*s1++) ;
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
配列変数名はポインタとして扱えますが、ポインタ変数ではありません。 ポインタ変数が表すアドレスは「変数に格納された値」なので、値の操作によりアドレスの変更ができます。 これに対し、配列変数名が表すアドレスは「変数自身のアドレス」であり、通常の変数で言えば「&変数名」にあたるものです。 このアドレスはコンパイラによって算出されたものであり、メモリ上のどこにも格納されてはいません。 そのような値を「左辺値」として利用することはできません。 (変数自身のアドレスは「定数ポインタ(type * const型)」として扱われます。)
その他の回答 (3)
- sha-girl
- ベストアンサー率52% (430/816)
配列名=ポインタというよりは 配列の添え字をとったときにポインタになるというだけです。 配列s1[2]を*(s1+2)というような使い方は可能です。 ポインタに対して*(p1++) p1という数値に1001(番地)がはいっていれば1002(番地)になります(charの場合) しかし配列*(s1++)はそのポインタの移動後の番地を保存しておく場所が確保されていません。 p1 = s1 + 1;だったらokです。
お礼
回答ありがとうございました。
- ranx
- ベストアンサー率24% (357/1463)
ポインタは変数、配列は定数。 int a; で a=1; とは書けても 1=a; とは書けない。 それとほぼ同じ。
- gimmick
- ベストアンサー率49% (134/270)
>while(*s2++=*s1++) s1++とs2++が問題。配列名には++は適用できません。 #ついでに言うと、コード1の「char *t=s2;」は「char *t=d;」の間違いかな? 標準ライブラリのstrcpyを真似した場合の話だけど。
お礼
回答ありがとうございます。 確かにs1、s2は配列名です。しかしながら、配列名=ポインタであると思っていましたが解釈がおかしいのでしょうか? 事実コード1では、s1、s2のポインタ渡しを行っていると思うのですが・・・
補足
>「char *t=d;」の間違いかな? そうです。あわてて間違えました。
お礼
回答ありがとうございました。 納得できる説明で良く分かりました。