こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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


”int *a,*b”このような変数をグローバル宣言した場合、
a=&bというようなことはできるのでしょうか?


”int *a,*b”
この宣言で、
aが10番地
bが20番地に定義されたと仮定しています。

投稿日時 - 2010-04-26 10:09:03

QNo.5852285

すぐに回答ほしいです

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

#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;なども構文的にはありです。

投稿日時 - 2010-04-26 14:33:30

お礼

回答頂きありがとうございました。

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

投稿日時 - 2010-04-26 15:19:47

ANo.8

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

A1.
そう考えればいいです。

A2.
全く異なるプログラムです。

a = b;

の場合の結果は#4で言ったとおりなので*aを操作するとbが示す先(=*b)が書き換わる事になりますが、

a = (int *)&b;

とした場合、aにはbのアドレス、即ちこの場合なら20が入ります。
bのアドレスがaに入っている状態なので*aを操作するとbの中身自体が書き換わります。
なお、型が本来想定されているものと異なるので、これによってどのような影響が出ても文句は言えません。

A3.
既に言われていることですが、「ポインタの示す先の型が違う」からです。

投稿日時 - 2010-04-26 11:28:38

お礼

回答頂きありがとうございます。

一応整理させてください。

質問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のポインタのポインタの使い方はこれでよいでしょうか?

投稿日時 - 2010-04-26 14:13:31

ANo.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と強引にキャストすれば、コンパイラエラーはとれます。

投稿日時 - 2010-04-26 11:26:55

お礼

回答頂きありがとうございます。

一応整理させてください。

質問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のポインタのポインタの使い方はこれでよいでしょうか?

投稿日時 - 2010-04-26 13:37:21

ANo.5

>aのアドレス領域10番地からの4バイトには入ってくる値はどうなるのでしょうか?

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

投稿日時 - 2010-04-26 11:14:50

お礼

回答頂きありがとうございます。

一応整理させてください。

(1)int *a,*b,

(2)a=(int*)&b;

これをメモリアドレスの変化で見ていった場合、


(1)
アドレス10:a NULL
アドレス20:b NULL

(2)
アドレス10:a 20
アドレス20:b NULL



このようにメモリ内が変化していくということなんですね。

投稿日時 - 2010-04-26 13:20:47

ANo.4

a = bとした場合、aにはもちろんbの中身が代入されます。
つまり、そのときにbが示していたアドレスがaに入ります。

なお、ポインタは4バイトとは限りません。

投稿日時 - 2010-04-26 10:46:26

お礼

回答頂きありがとうございます。

ちょっと確認させていただきたいのですが、

質問(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というのがポインタ変数だからでしょうか?

投稿日時 - 2010-04-26 10:58:52

ANo.3

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

投稿日時 - 2010-04-26 10:26:12

お礼

回答頂きありがとうございました。

”a=(int*)&b;”

このプログラムだと、コンパイルエラーが出ないとのことですが、


aのアドレス領域10番地からの4バイトには入ってくる値はどうなるのでしょうか?



現在ポインタをたくさん使ったプログラムソースを読む機会があり、ポインタの使い方を調べています。
ポインタのポインタというものを使う必要があるのかと思っているのですが、

もし、int *a,*b,**c;

と宣言したとして、
aが10番地
bが20番地
cが30番地

と割り振られた場合、

c = b;

とすれば、ポインタ変数cのメモリアドレス30番地にはbのアドレス番地20が格納するということになるのでしょうか?

投稿日時 - 2010-04-26 10:50:08

ANo.2

基本的には出来ません。

a, b はともにint型へのポインタなので、
 a = b;
は可能ですが、
 a = &b;
はint型へのポインタのポインタの代入になるので、型が異なりエラーとなります。

ただし、C言語には型キャストという禁断の反則技があるので、
 a = (int *)&b;
とすればコンパイルは通ります。もっとも、だからといってデータの実体は変わらないので使い方を間違うと実行時にバスエラー等が起こります。

上記の使い方としては
 *a
とした時に、bの値をint型で取り出せるというところでしょうか。

投稿日時 - 2010-04-26 10:24:26

お礼

回答頂きありがとうございます。

”a = b;”

これは可能とのことですが、この場合、aの定義アドレス10番地からの4バイトにはどのような値がはいってくるのでしょうか?

投稿日時 - 2010-04-26 10:41:24

ANo.1

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

投稿日時 - 2010-04-26 10:13:19

お礼

回答頂きありがとうございます。

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

投稿日時 - 2010-04-26 10:37:25

あなたにオススメの質問