• 締切済み

C言語(またはC++言語)についての質問です。

C言語(またはC++言語)において、以下の変数x、ポインタ変数(*p,**pp, ***ppp)のメモリ上のイメージを記述しなさい。 int x, *p, **pp, ***ppp; x=10; p=&x; pp=&p; pppp=&pp; という問題なのですが、わからなくて困っています。 このプログラムはどのようなものなのでしょうか。 詳しい回答をよろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

int x, *p; x = 10; p = &x; はわかりますか? ちなみにここに挙がっているものだと「コンパイルエラー」だね.

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> このプログラムはどのようなものなのでしょうか。 質問文にあるコードだけだと大したことはやっていません。 int型の変数xにint型の値10が入っていて、ポインタ型の変数pがxを指していて、以下同様にppがpを、pppがppを指しているだけです。

t1fal0ckhart
質問者

補足

回答ありがとうございます。 つまりこの問題はどういった答えになるのでしょうか。 早急にお願いします。

関連するQ&A

  • 【C言語】別関数でポインタの値を変えたのに変わらない。

    【C言語】別関数でポインタの値を変えたのに変わらない。 メイン関数のポインタの値を、別関数で書き換えるプログラムを作りました。 以下がそのプログラムになります。 そのままだと、ダブルポインタを操作する必要があるので分かり辛いです。なので、ダブルポインタをシングルポインタにしてからポインタの書き換えを行うようにしました。その結果、きちんとポインタの書き換えが出来なくなってしまいました。 なぜ出来なくなってしまったのでしょうか。 2つのプログラムの違いは、 >  *pp = &dummy; が >  p = *pp;      // ダブルポインタをシングルポインタにした >  p = &dummy; に変わっただけです。 【参考】http://www.kouno.jp/home/c_faq/c4.html#8 -----------------正しいプログラム---------------- // 以下プログラムは、正しく動作する // 実行結果は、 //   p = 5 // と表示される void func( int **pp ); int main (void){   int *p;   int a = 0;   p = &a;   func( &p );   printf("p = %d\n", *p);   return 0; } void func( int **pp ){   static int dummy = 5;   *pp = &dummy; } ---------------------------------------------- -----------------間違いプログラム---------------- // 以下プログラムは、正しく動作しない // 実行結果は、 //   p = 0 // と表示される void func( int **pp ); int main (void){   int *p;   int a = 0;   p = &a;   func( &p );   printf("p = %d\n", *p);   return 0; } void func( int **pp ){   static int dummy = 5;   int *p;   p = *pp;      // ダブルポインタをシングルポインタにした   p = &dummy; } ----------------------------------------

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • C言語のプログラミング

    C言語のプログラムを読もうとしているのですが、初心者故に難儀しており、お助けいただければ幸いです。 プログラムの内に下記のような「CnsktModule* 」の部分があります。 例えば、char *p; のような記述であれば、p はポインタでポインタの指し示す内容はキャラクタの型を 持っていると理解できるのですが、「CnsktModule* 」はどのように解釈したらよいのでしょうか? CnsktModule* cnsktNew(char *printer, char *locale, char *folder_path, int port_num) { 以下省略

  • C++言語のポインタについて

    現在、C++言語を学習しているのですが、 ポインタを使わない、 int main() { Human human; human.Introduction(); } と、ポインタを使った、 int main() { Human *p; p = new Human; p->Introduction(); delete p; } があります。どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 メモリの節約?動作速度?のためなのでしょうか? なぜ使われるのか教えてください。

  • error C2105 CとC++の違い関して

    C++で動いていたプログラムをCに移行したらerror C2105が出力されました。プログラムは以下の通りです。   :  int *p;  int i;   : i = *(++p)++; //pを1つ進めて、内容を取り出し、さらにpを進めたい   :  C++では++Pの評価結果がポインタ変数となり、Cでは単なるアドレスになってしまっているようですが、  これは言語仕様の違いですか?  それとも、私のC++ではたまたま動いただけで、本来このような使用方法はしてはいけないのでしょうか?  私はVisualC++6.0を使用しています。また、上記でC++とCといっているのは、ファイルの拡張子をcppをcにしただけのことを言っています。どなたかご教授お願いします。

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

    (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言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。

  • C言語のポインタについての質問です。

    C言語のポインタについての質問です。 2つのプログラムを作り、片方で数値を入力し、 もう片方でその数値を読み取りたいと思っています。 数値入力のプログラムは次のようになっています。 #include<stdio.h> void main(void){ int A=1; int *p; p=&A; printf("%p\n",p); } この実行結果は「0012FF88」となりました。 次にこの「0012FF88」というアドレスを使って「1」を読み取る 別のプログラムを作りたいと思っています。 #include<stdio.h> void main(void) { int add; int a; printf("アドレスは?\n"); scanf("%x",&add);    //「0012FF88」と入力 a=*(int*)add; printf("%x---->%d",&add,a); } このようなプログラムを作ってコンパイルできたのですが、 実行してアドレスを打ち込むと「Win32の例外が発生しました」 となって実行できません。 何かよい方法やプログラムの問題などありましたら 教えて頂けませんか?

  • C言語のポインタの考え方について

    ポインタについて理解ができていないのでお聞きしたいのですが 値を交換する関数のプログラミングでこの場合ポインタ で以下にしないといけないと思います。 #include<stdio.h> void swap(int *a int *b){ int c; c=*a; *a=*b; *b=c; } main(){ int x,y; x=123; y=456; swap(&x,&y); printf("x = %d, y = %d\n", x, y); } またポインタを使用せず以下のプログラムではなぜダメのでしょうか。 よろしくお願い致します。 #include<stdio.h> void swap(int a int b){ int c; c=a; a=b; b=c; } main(){ int x,y; x=123; y=456; swap(x,y); printf("x = %d, y = %d\n", x, y); }

  • C言語 アロー演算子について質問です。

    こんにちわ C言語初心者です。 C言語の教科書を見ていたら 双方向リストへの挿入というところで struct CELL{ struct CELL *prev; struct CELL *next; int value; } x->prev=p; x->next=p->next; p->next->prev=x; p->next=x; という記述がありました。 質問はこの部分で p->next->prev=x; アロー演算子が2個つくとどうなるんですか? 出来ればこの双方向リストの例でたとえてもらえるとうれしいです。 よろしくお願いします。

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

専門家に質問してみよう