• 締切済み

Cのポインタについて

初めて利用させてもらいます 現在C言語のポインタを勉強しているのですが、 ポインタを利用した入れ替えで pをポインタにしたとき p=str[i]; str[i]=str[j]; str[j]=*p; とやろうしたとき p=str[i]でエラーがでるのですが、 これは、できない記述なのでしょうか? 少しわかりにくくなってしまってすみません

みんなの回答

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.5

おそらく 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)
回答No.4

変数の型が分からないのですが、 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)
回答No.3

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)
回答No.2

*p=str[i]; str[i]=str[j]; str[j]=*p; これならできると思います。

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

str[i]が文字型?なので、pには代入できませんね。 ただ、このプログラムだと1行目を p=&str[i]とした所で、すぐ下で str[i]の内容そのものを書き換えているので、最終的に str[j]=*p;←この時点の*pと1行目の*pで内容が異なる ので、内容は入れ替わりませんよ。

関連するQ&A