• ベストアンサー

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

tatsu99の回答

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • ポインタの宣言

    ポインタを宣言するとメモリ上に、ポインタ変数を格納するための領域が確保されます。ポインタ=アドレスというのは大丈夫なのですが、 int *b のようにどうして、ポインタに型があるのでしょうか?単に変数のアドレスを表示するだけならば型はいらないと思うのですが。 またこのとき宣言された変数は *b ではなくて b であってますよね?

  • ポインタ変数を変数に渡す方法

    (int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • 変数宣言・変数定義のちがいって??

    変数宣言・変数定義のちがいって?? 同じ意味なんでしょうか? 私の解釈では、 ・宣言っていうのは、今からこの変数を使いますよってことで。 ・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・・ なので、 int a; ←これは変数定義 extern int a; ←これは変数(extern)宣言 あってるでしょうか?

  • int型のポインタ

    int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているのをよく見かけますが、 なぜでしょうか? 私はCに慣れていないため、int型くらいのサイズだったら、なるべくならポインタを使わないで書いてもらった方が可読性が良いので、ポインタにするメリットがあまり感じられません。

  • ポインタ宣言とメソッド定義について

    C++でのポインタ宣言とメソッド定義について教えていただきたいのですが int a; int* b=&a; int *b=&a 型の後ろに*をつける場合と、変数名の前につける場合って 同じ意味合いと解釈してもよろしいのでしょうか? また、以下のコンストラクタ実行時に:x(0)という記述はx=0と同じ処理をしているのでしょうか? よろしくお願いいたします。 class test{ public: int x; test(); } test::test():x(0) { } int main() { test obj; return 0; }

  • ポインタ変数への値代入とアドレス値の代入について

    ポインタの扱いについて2点ほどありますが教えてください。 質問1:ポインタへの値代入    short data1[5];    short *pointa;     pointa = data1    (1)*(pointa + 1)=100;    (2)*pointa + 1 = 100;   という式があった場合、    (1)はdata1[1]の配列に100を代入する    (2)は命令違反的なことでコンパイルエラーが発生する   という理解でよろしいでしょうか? 質問2:アドレス値の代入    int var;(varのアドレス値は100番地)    int *ptr;    *ptr = &var; という式があった場合    ポインタ変数のptrには、番地が入るのではなく、100という数値が入るという判断でよろしいいでしょうか?    長い質問となっていますので質問1,2どちらか一方でも、余裕のある方がおりましたら両方についてご解答のほどよろしくお願いします。

  • メモリセルと変数 ( a = b + cの意味)

    メモリセルと変数の関係について勉強しています。 動的(non-static)なローカル変数 bとcが宣言されたあと、 次の文が 出現したとします。 int a = b + c; 問題を解いてるのですが、問題によると、 この文章で 変数とメモリセルが結びつく 機会を二つ答えよ。 「変数aの値が aのメモリセルに保存される」というのが、一つだと考えるのですが、もう一つが思いつきません。 変数bは "int a = b + c;" の以前に、宣言されているので、bとbのメモリセルはこの文より前に結びついてます。 同様にcも この文より前にメモリセルと結びついています。 考えられるのは、b + c なのですが、 a = b + c の意味が 「b+c の計算結果の値を a のメモリセルに 保存する」 という 答えが二つになります。 a = b +c の意味はこれでいいのでしょうか? 文章がわかりにくくてすみません。 要はa = b + cの本質的意味が知りたいのです。

  • パブリック変数を宣言する時に・・・

    エクセルVBAの質問です。 モジュールAとBがあるとしまして、 Aの中にあるプロシージャからBの中のプロシージャを呼び出す場合、 変数を引き渡したいとしたらパブリック変数を使いますよね? この場合宣言は、 Aの宣言セクションでするのか、 Bの宣言セクションでするのか、 あるいは両方で同じ変数を宣言するのか、 どれなんでしょ?

  • mainの外に変数 vs ポインタ渡し

    C++についての質問です。プログラミング初心者ですが、よろしくお願いします。 最近、関数の外側でも変数を宣言できることを知りました。関数の外側で変数を宣言すると、全ての関数でその変数にアクセスすることができ大変便利なように思います。 「わざわざポインタ渡しなどする必要はないのでは?」と思ってしまいました。 これは何か問題があるのでしょうか? 初心者の言葉で説明しても理解しにくいかと思いますので、例として「足し算するプログラム」を以下に記載します。 ポインタ渡しで書くと、以下のような感じになるかと思います。 //●ポインタ渡し #include "stdafx.h" #include <iostream> void func(int x,int y,int *pans){ *pans = x+y; } void main(){ int a=10, b=20, ans; func(a,b,&ans); std::cout << ans << std::endl; } しかし、mainの外に変数を宣言すれば //●mainの外に変数 #include "stdafx.h" #include <iostream> int a,b,ans; void func(int x,int y){ ans = x+y; } void main(){ a=10; b=20; func(a,b); std::cout << ans << std::endl; } ansをポインタ渡しする必要なく、funcの計算結果をansに代入できました。 「●mainの外に変数」のプログラムはどのような問題や危険性を孕んでいるのでしょうか? 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • 【C++】メンバ変数をポインタで宣言するデメリット

    クラスAが、メンバーとして、 クラスXと、クラスYを持っているとします。 そのようなとき、 【ケース1】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタで宣言させる。 【ケース2】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタではなく、クラスX/クラスYの型として宣言させる。 があると思いますが、それぞれどのようなデメリットがあるでしょうか? ----------------------------- 私は、ケース1は、 メリット:   クラスXを継承したクラスChild_Xや、クラスYを継承したクラスChild_Yを、   クラスAで扱えるようになる。   デメリット:   クラスXのポインタで宣言していると、クラスXを派生したクラスが格納可能であるため、   開発時に、そのメンバーに、実際にはどの型のクラスが格納されているかがわからず、   Visual Studio で追いかけられない。   (※そのメンバーに対して、右クリック⇒定義で見ても、どの型のポインタ変数かはわかっても、     どの型がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。) 私は、処理を確認する際、『どの型の値がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。』というのが、可読性は悪いわ、確認に時間が取られるわで、 非常に大きなデメリットと考えています。 このデメリットを解消する方法はあるのでしょうか?