関数のポインタのポインタとセット関数で3.140000を表示させる方法について

このQ&Aのポイント
  • 関数のポインタのポインタとセット関数を使用して、3.140000を表示させる方法を知りたい。
  • gcc -Wallで探しても/bin/などの表示があり、どの部分を修正すれば良いのか分からない。
  • 簡易C言語では3.139999 = 3.140000となるが、どこかで0.000001を足す必要があり、なぜ3.139999が表示されるのかも知りたい。
回答を見る
  • ベストアンサー

関数のポインタのポインタ・・・

main内部を変更してはならない。 関数setとsetsetで、3.140000と表示させよ gcc -Wallでいろいろと探したのですが /bin/などと表示されていて、何を直せばいいのか、わからない状態です。 簡易c言語だと 3.139999 = 3.140000 となります どこかで0.000001を足すのでしょうか? でもxで3.14で出てますしね。むしろなぜ3.13999が出てきたのか。 ただ学校のコンパイラだとセグメントエラが出ます #include <stdio.h> void out(double **); void set(double *,double **); void setset(double **,double ***); int main() { double x; double *p; double **pp; x = 3.14; set(&x, &p); setset(&p, &pp); out(pp); return 0; } void set(double *x,double **p) { *p = x; } void setset(double **p,double ***pp) { **pp = *p; } void out(double **pp) { printf("%f = 3.140000\n", **pp); }

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

  • ベストアンサー
回答No.1

#include <stdio.h> void out(double **); void set(double *, double **); void setset(double **, double ***); int main(void) { double x; double *p; double **pp; x = 3.14; set(&x, &p); setset(&p, &pp); out(pp); return 0; } void set(double *x,double **p) { *p = x; } void setset(double **p,double ***pp) { *pp = p; } void out(double **pp) { printf("%f = 3.140000\n", **pp); }

izupawapuro
質問者

お礼

渡されたものをそのまま使えばよかったんですね・・・ ありがとうございました!

その他の回答 (1)

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

void set(double *x,double **p) { printf("3.140000"); } void setset(double **p,double ***pp) { printf("3.140000"); }

関連するQ&A

  • ポインタについて

    #include <stdio.h> int main( void ) { intx; printf("x = %p\n", &x); printf("x = %d\n", &x); printf("x = %p\n", x); printf("x = %d\n", x); return 0; } 一応僕が使っている参考書によると printf("x = %p\n", &x); はxのアドレスを表示するようですが 他の三つは何を表示するのでしょうか? よければ詳しい説明をつけてくれるとうれしいです (~が~だから~と表示される)みたいなかんじで お願いします

  • 【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; } ----------------------------------------

  • 関数とポインタについて

    #include <stdio.h> void test(int *p); int main() { int i; test(&i); printf("%d",i); return 0; } void test( int *p) { static int k; k = 10; p = &k; } このようなプログラムを作って、void test()のkの値をmain関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • ポインタのポインタの関数受け渡しについて

    現在ポインタのポインタを利用したプログラムを作成しています。 main関数で int **dt; と宣言したとして、配列のセットにはset関数を、 表示に関する処理をpt関数で行いたいと思っています。 void set(int ??); void pt(int ???); int main(void){ int **dt; set(??); pt(???); } void set(int ??){ dt = (int**)malloc(sizeof(int*) * k); for(i = 0; i < k; i++){ dt[i] = (int*)malloc(sizeof(int*) * k); } のように配列サイズの動的確保が目的 } void pt(int ???){ 二重forループ{ printf(dt[i][j]); } } ??、???には何を入れるべきかが理解できません。 ご教示のほどよろしくお願いいたします。

  • ポインタ定義は必要なんですか?

    #include <stdio.h> int main( void ) { int x; int *p; p = &x; printf("Address = %p\t\n", p ); return 0; } を #include <stdio.h> int main( void ) { int x; int p;←ここを上とはかえた p = &x; printf("Address = %p\t\n", p ); return 0; } にしたところコンパイル時に p = &x に関して 移植性のないポインタ変換と表記されますが 結果は同じだったのでポインタ定義というのは結局必要なんですか? 移植性のないポインタ変換とはなんなんですか? よければ詳しく教えてください

  • 再帰関数でポインタのインクリメントがうまくいかない 

    再帰関数で標準出力に文字列を表示するプログラムを書きました。 #include <stdio.h> void display(char *p); int main(void) { display("おちょめちょめ"); return 0; } void display(char *p) { if(*p){ printf("%c",*p); dis(p++); } } 実行するとbがいっぱい出てきます。?? 一番最後のコードですが、()の中を p=p+1 p+=1 p+1 などにするとちゃんと おちょめちょめ と表示されます。なぜでしょうか。

  • C言語 ポインタ 関数

    キーボードから文字列”abcdefg”を入力し、main関数で配列aryに格納する。 main関数から配列aryの先頭アドレスを副関数に引き渡す。 副関数で配列aryの最後尾の要素の内容を';'に変更する。 main関数で配列aryの内容を表示する。 この問題が解けません... #include <stdio.h> int main (void) { char ary[]="abcdef"; int *p; int i,x; p=&ary[0]; func(&i); for (x=0;x<=7;x++){ printf("%s",ary[x]); void func (int i) if(i==\0) i=';' else i++ } return 0 } とりあえずこんな感じなんですけど、出来ませんでした...

  • c言語

    #include<stdio.h> main(void) { int x; double y,sum; void p(double *); for(sum=0.0,x=1;x<10;x++){ sum+=1.0/p(&x); ここでエラーがでます。 } printf("%d\n",sum); } void p(double *y) { *y*=*y; } どうしてエラーがでるかわかりません。教えてください!

  • ポインタにによる値の表現と文字列の表現について

    ◎1------------------------------ #include<stdio.h> int main(void) { char *pt="ABC"; printf("pt=%s\n",pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("pp=%s\n",pp); return 0; } -------------------------------------- ◎2---------------------------------- #include<stdio.h> int main(void) { char *pt="ABC"; printf("*pt=%s\n",*pt); char dt[10]="ABCDE"; char *pp; pp=dt; printf("*pp=%s\n",*pp); return 0; } ----------------------------------- ◎3--------------------------------------- #include<stdio.h> int main(void) { int ary[5]={111,222,333,444,-1}; int* pt=ary; while(1){ printf("%d ",*pt); ++pt; if(*pt==-1){ break; } } puts(""); return 0; } ----------------------------------------------- 以上3つのプログラムで、◎1はprintfで「*」が付いてなく、正常に実行出来ました。 ◎2はprintfで「*」が付いてなく、エラーは出ませんが、文字列が表示されませんでした。 ◎3は文字列ではなく値ですが、printfで「*」が付いていて正常に実行できます。 これは、値の場合は「*pt」とすることで、ptのアドレスに値を代入しているという事で、「printf("%d ",*pt);」で実行できたということですかね? 文字列の場合は、先頭のアドレスを渡すだけなので、「printf("pt=%s\n",pt);」のようにしてアドレスを参照しないとダメであるということですか? ◎2で「printf("*pt=%s\n",*pt);」としてしまうと、何が起きてしまうのかわかりません。 以上、教えていただけると嬉しいです。

専門家に質問してみよう