- 締切済み
Cのポインタについて
初めて利用させてもらいます 現在C言語のポインタを勉強しているのですが、 ポインタを利用した入れ替えで pをポインタにしたとき p=str[i]; str[i]=str[j]; str[j]=*p; とやろうしたとき p=str[i]でエラーがでるのですが、 これは、できない記述なのでしょうか? 少しわかりにくくなってしまってすみません
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- ttyp03
- ベストアンサー率28% (277/960)
おそらく str は char str[xxx]、p は char* p ですよね。 それを前提で書かせていただきます。 p は char型のポインタです。 str[i] は char型です。 従って同じ型ではないので代入することができません。 代入するには、 p = &str[i]; とします。つまり str[i] のアドレスを代入する必要があります。 しかし別の回答者さまも言っていますが、入れ替えるプログラムとしてはこれは不完全です。 p には str[i] のアドレス。 str[i] に str[j] str[j] に p の実体。 p は str[i] ですから、先ほどの格納した str[j] です。 つまり str[i] も str[j] も str[j] になってしまいます。 こういう場合は p をポインタにせずに char p とすれば良いでしょう。
- matsu-td
- ベストアンサー率31% (5/16)
変数の型が分からないのですが、 char *p; char str[10]; だとして、回答させて頂きます。 p = str[i]; これは、pがchar*型、str[i]がchar型で、型が違うので代入できません。redrikoさんのやりたいことは、 p = &str[i]; だと思います。これで、pにはstr[i]のアドレスが代入されます。ただ、そうすると、 str[i] = str[j]; の行で、*pの内容も書き換わってしまいます。なので、このプログラムは結果的に、str[j]をstr[i]にコピーするだけになってしまいます。 このプログラムの目的は、str[i]とstr[j]の内容を入れ替えたいということなのでしょうか?だとしたら、ポインタではなく、str[i]の内容を退避するchar型の変数が必要になります。 char c; c = str[i]; str[i] = str[j]; str[j] = c; もう一つ補足ですが、 *p = str[i]; これをいきなりやると、ポインタが初期化されてない(アドレスが代入されていない)ので、プログラムは暴走します。
- shkwta
- ベストアンサー率52% (966/1825)
p=str[i]; これは左辺がポインタ、右辺が非ポインタなのでエラーになります。 入れ替えをする場合、ポインタだけだと記憶領域がないので、入れ替えのための退避ができません。 char str[30]; char a; char * p; ・・・ p = &a; *p = str[i]; str[i]=str[j]; str[j]=*p; これなら、入れ替えができるでしょう。でも、これでは何のためにポインタを使うのかわからなくなります。 ポインタは、次のように、データ自体の入れ替えをせずに、いわば「名前を交換する」という形で使うと便利です。 char stra[30]; char strb[30]; char * p; char * q; ・・・ p = stra; q = strb; ・・・ p = strb; q = stra; ・・・
- nearn
- ベストアンサー率0% (0/5)
*p=str[i]; str[i]=str[j]; str[j]=*p; これならできると思います。
- OsieteG00
- ベストアンサー率35% (777/2173)
str[i]が文字型?なので、pには代入できませんね。 ただ、このプログラムだと1行目を p=&str[i]とした所で、すぐ下で str[i]の内容そのものを書き換えているので、最終的に str[j]=*p;←この時点の*pと1行目の*pで内容が異なる ので、内容は入れ替わりませんよ。