• ベストアンサー

”int *a,*b”というポインタ変数宣言した値でa=&bということ

”int *a,*b”というポインタ変数宣言した値でa=&bということはできる? ”int *a,*b”このような変数をグローバル宣言した場合、 a=&bというようなことはできるのでしょうか? ”int *a,*b” この宣言で、 aが10番地 bが20番地に定義されたと仮定しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.8

#6です。 >回答頂きありがとうございます。 >一応整理させてください。 >質問1: >(1)int *a, *b; //宣言 >(2)a = b; >これをメモリアドレスの変化で見ていった場合、 >(1) >アドレス10:a NULL >アドレス20:b (仮に1200) >(2) >アドレス10:a (仮に1200) >アドレス20:b (仮に1200) 回答: OKです。但し アドレス10:a NULL のところは正確には、アドレス10:a 不定 となります。 不定の意味は初期化していないので何が入っているか判らない。 (0かも知れないし、そうでないかも知れない。あるいは35かも知れないし、そうでないかもしれない) という意味です。(NULLの箇所は以降同じです) >質問2: >(1)' int *a, *b; //宣言 >(2)' a = (int *)&b; >これをメモリアドレスの変化で見ていった場合 >(1)' >アドレス10:a NULL >アドレス20:b NULL >(2)' >アドレス10:a 20 >アドレス20:b NULL >このような違いがあるということですね。 回答 はい、その通りです。 >質問3: >int *a, *b; //宣言 >a=&b; >このやり方はできないので、 >もし、やりたいのならば、 >(1)'' int **a, *b //宣言 >(2)'' a=&b; >これをメモリアドレスの変化で見ていった場合 >(1)'' >アドレス10:a NULL >アドレス20:b NULL >(2)'' >アドレス10:a 20 >アドレス20:b NULL >このようにメモリ内が変化していくということなんでしょうか? 回答 はい、その通りです。 >質問3のポインタのポインタの使い方はこれでよいでしょうか? 回答 はい、よいです。 ちなみに、このような事例に遭遇することはないでしょうが、 int ***a,**b; の場合、a=&bは構文的に正しいです。 a=(int***)b;(強引なキャスト) も正しいです。 int *a; int **a; int ***a; の違いを理解することが必要です。 使いませんが、 int **********a;なども構文的にはありです。

techhouse
質問者

お礼

回答頂きありがとうございました。 みなさま本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.7

A1. そう考えればいいです。 A2. 全く異なるプログラムです。 a = b; の場合の結果は#4で言ったとおりなので*aを操作するとbが示す先(=*b)が書き換わる事になりますが、 a = (int *)&b; とした場合、aにはbのアドレス、即ちこの場合なら20が入ります。 bのアドレスがaに入っている状態なので*aを操作するとbの中身自体が書き換わります。 なお、型が本来想定されているものと異なるので、これによってどのような影響が出ても文句は言えません。 A3. 既に言われていることですが、「ポインタの示す先の型が違う」からです。

techhouse
質問者

お礼

回答頂きありがとうございます。 一応整理させてください。 質問1: (1)int *a, *b; //宣言 (2)a = b; これをメモリアドレスの変化で見ていった場合、 (1) アドレス10:a NULL アドレス20:b (仮に1200) (2) アドレス10:a (仮に1200) アドレス20:b (仮に1200) 質問2: (1)' int *a, *b; //宣言 (2)' a = (int *)&b; これをメモリアドレスの変化で見ていった場合 (1)' アドレス10:a NULL アドレス20:b NULL (2)' アドレス10:a 20 アドレス20:b NULL このような違いがあるということですね。 質問3: int *a, *b; //宣言 a=&b; このやり方はできないので、 もし、やりたいのならば、 (1)'' int **a, *b //宣言 (2)'' a=&b; これをメモリアドレスの変化で見ていった場合 (1)'' アドレス10:a NULL アドレス20:b NULL (2)'' アドレス10:a 20 アドレス20:b NULL このようにメモリ内が変化していくということなんでしょうか? 質問3のポインタのポインタの使い方はこれでよいでしょうか?

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

>質問(1) >int *a, *b; //宣言 >a = b; >これをやった場合にはaのメモリアドレス10番地にbのメモリアドレス20番地にある値がコピーされる >という考えでよいでしょうか? はい、20番地に4バイトのデータ1200があれば、10番地に4バイト分1200がセットされます。 >質問(2) >int *a, *b; //宣言 >a = b; >このことと、 >a = (int *)&b; >これは全く同じ意味のプログラムでしょうか? ちがいます。 10番地から4バイトにbのアドレスを示す20が設定されます。 >質問(3) >int *a, *b; //宣言 >a = &b; >これができない理由というのはbというのがポインタ変数だからでしょうか? はい、その通りです。 aもbもポインター変数で、 その型は、int* 型になります。 a=bは同じ型なのでOKですが、 &bとすると 更に int *型のアドレスなのでint**型になります。 int**型をint*型に転送するのはできません。 なので(int*)&bと強引にキャストすれば、コンパイラエラーはとれます。

techhouse
質問者

お礼

回答頂きありがとうございます。 一応整理させてください。 質問1: (1)int *a, *b; //宣言 (2)a = b; これをメモリアドレスの変化で見ていった場合、 (1) アドレス10:a NULL アドレス20:b (仮に1200) (2) アドレス10:a (仮に1200) アドレス20:b (仮に1200) 質問2: (1)' int *a, *b; //宣言 (2)' a = (int *)&b; これをメモリアドレスの変化で見ていった場合 (1)' アドレス10:a NULL アドレス20:b NULL (2)' アドレス10:a 20 アドレス20:b NULL このような違いがあるということですね。 質問3: int *a, *b; //宣言 a=&b; このやり方はできないので、 もし、やりたいのならば、 (1)'' int **a, *b //宣言 (2)'' a=&b; これをメモリアドレスの変化で見ていった場合 (1)'' アドレス10:a NULL アドレス20:b NULL (2)'' アドレス10:a 20 アドレス20:b NULL このようにメモリ内が変化していくということなんでしょうか? 質問3のポインタのポインタの使い方はこれでよいでしょうか?

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>aのアドレス領域10番地からの4バイトには入ってくる値はどうなるのでしょうか? 一般論ですがbのアドレス20が入ると考えて良いです。 但し、これは一般論ですので、その条件で本当に実際に実行できるかどうかは別です。 (実行時エラーが発生するかも知れませんし、そもそも10番地にint*aのポインターを割り付けることができるかどうかも判りません)

techhouse
質問者

お礼

回答頂きありがとうございます。 一応整理させてください。 (1)int *a,*b, (2)a=(int*)&b; これをメモリアドレスの変化で見ていった場合、 (1) アドレス10:a NULL アドレス20:b NULL (2) アドレス10:a 20 アドレス20:b NULL このようにメモリ内が変化していくということなんですね。

すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

a = bとした場合、aにはもちろんbの中身が代入されます。 つまり、そのときにbが示していたアドレスがaに入ります。 なお、ポインタは4バイトとは限りません。

techhouse
質問者

お礼

回答頂きありがとうございます。 ちょっと確認させていただきたいのですが、 質問(1) int *a, *b; //宣言 a = b; これをやった場合にはaのメモリアドレス10番地にbのメモリアドレス20番地にある値がコピーされる という考えでよいでしょうか? 質問(2) int *a, *b; //宣言 a = b; このことと、 a = (int *)&b; これは全く同じ意味のプログラムでしょうか? 質問(3) int *a, *b; //宣言 a = &b; これができない理由というのはbというのがポインタ変数だからでしょうか?

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

#1のかたの言うとおりですが、 どうしてもしたいのなら a=(int*)&b; とすれば、コンパイルエラーはなくなり、実行できます。 普通、そのようなことは、行いませんので、 望んだ結果が得られるかどうかは判りません。 どうして、そのようなことをなさりたいのかを、提示すれば もっと良い回答が、得られるかと思います。

techhouse
質問者

お礼

回答頂きありがとうございました。 ”a=(int*)&b;” このプログラムだと、コンパイルエラーが出ないとのことですが、 aのアドレス領域10番地からの4バイトには入ってくる値はどうなるのでしょうか? 現在ポインタをたくさん使ったプログラムソースを読む機会があり、ポインタの使い方を調べています。 ポインタのポインタというものを使う必要があるのかと思っているのですが、 もし、int *a,*b,**c; と宣言したとして、 aが10番地 bが20番地 cが30番地 と割り振られた場合、 c = b; とすれば、ポインタ変数cのメモリアドレス30番地にはbのアドレス番地20が格納するということになるのでしょうか?

すると、全ての回答が全文表示されます。
回答No.2

基本的には出来ません。 a, b はともにint型へのポインタなので、  a = b; は可能ですが、  a = &b; はint型へのポインタのポインタの代入になるので、型が異なりエラーとなります。 ただし、C言語には型キャストという禁断の反則技があるので、  a = (int *)&b; とすればコンパイルは通ります。もっとも、だからといってデータの実体は変わらないので使い方を間違うと実行時にバスエラー等が起こります。 上記の使い方としては  *a とした時に、bの値をint型で取り出せるというところでしょうか。

techhouse
質問者

お礼

回答頂きありがとうございます。 ”a = b;” これは可能とのことですが、この場合、aの定義アドレス10番地からの4バイトにはどのような値がはいってくるのでしょうか?

すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

型が違うので、エラーとなります。 int *a,b; a=&b; とか、 int **a,*b; a=&b; とかなら、エラーにはなりません。

techhouse
質問者

お礼

回答頂きありがとうございます。 現在、ポインタを使ったプログラムのソースを読む機会があり、このような質問をさせて頂いています。ポインタのポインタというものがあることを聞いていたので、やはりこのような結果となるのかと思っております。

すると、全ての回答が全文表示されます。

関連するQ&A