• ベストアンサー

ポインタを用いてドット演算子で表示させる方法について

普通、下記のような処理の場合sp->noで表示させるのですが、ドット演算子を用いても表示できると聞きましたので試してみましたが無理でした。どうすればいいでしょうか? #include<stdio.h> struct list{ int no; }list={1}; void main(void) { struct list *sp; sp = &list; printf("sp = %d\n", sp->no);//OK printf("sp = %d\n", (*sp).no);//NG }

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

  • ベストアンサー
  • wsx523
  • ベストアンサー率100% (1/1)
回答No.1

プログラムは問題ないと思います. spが構造体へのポインタの場合, sp->no は (*sp).no と同等(略記法)なので プログラムは正しいはずです. 実際に実行しても正しく動きました.

yukikundesuyo
質問者

お礼

Borland C++を再インストールしなおした後、うまく動きました。お騒がせしました。

その他の回答 (1)

  • ryuta_mo
  • ベストアンサー率30% (109/354)
回答No.2

VisualStudio2003でコンパイルしたら正常に動作しました。 どのように無理だったのか補足をお願いします。

yukikundesuyo
質問者

お礼

Borland C++を再インストールしなおした後、うまく動きました。お騒がせしました。

関連するQ&A

  • ポインタと動的確保について

    #include <stdio.h> #include <stdlib.h> typedef struct LIST{ int number; char name[30]; }list; void test(list** ls) { list *tmp; tmp=*ls; //tmpに*lsのアドレスを参照させる printf("%d\n",(*ls)->number); //5と表示 printf("%d\n",tmp->number); //5と表示 (*ls)->number=10; //lsの指すものを10に変更 printf("%d\n",(*ls)->number); //10と表示 printf("%d\n",tmp->number); //10と表示 *ls=(list *)calloc(1,sizeof(list)); //lsを動的確保 printf("%d\n",(*ls)->number); //callocで初期化されるので0 printf("%d\n",tmp->number); //10と表示 ← なぜ指すもののlsの値が変わったの //に値が変わらないのか } int main(void) { char input[12]; list *ls,ls2; ls2.number=5; ls=&ls2; test(&ls); scanf("%s",input); return 0; } void test(list **)の内容の動的確保後にポインタ変数tmpが 刺しているはずの**lsの内容が変わったのにtmpの内容が変わらない 理由がわかりません。 よろしくお願いします

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • ポインタ

    #include<stdio.h> #include<stdlib.h> struct number{ int value; struct number *next; }; int main(void){ FILE *f; struct number *p; int n=0,i; f=fopen("number.txt","r"); p=malloc(sizeof(struct number)); if(p==NULL){ printf("error"); return 1; } while(fscanf(f,"%d",&(p+n)->value)!=EOF){ (p+n)->next=malloc(sizeof(struct number)); if(p+n==NULL){ printf("error"); return 1; } p+n=(p+n)->next; n++; } for(i=0;i<n;i++) printf("%d\n",(p+i)->value); free(p); fclose(f); return 0; } のp+n=(p+n)->next;の部分でバグが出てしまうのですがアロー演算子と通常の演算子を同時に使うことができないなどのような規則があるのでしょうか、それとも俺がバカなだけなのでしょうか?ご指摘お願いします。

  • 構造体のサンプルのソースなんですけど・・

    自分が勉強するのに使ってる参考書にのってるサンプルのソースを自分なりにいじってみたら、コンパイルはできるのに実行すると、「不正な処理を行ったので強制終了します」とメッセージがでて実行できません。 ソースは↓ #include<stdio.h> #include<string.h> struct kakakutyp{ int teika; int waribiki; int yuutai; }; struct syohintyp{ char name[30]; struct kakakutyp kakaku; int zaiko; }; main() { struct syohintyp *sp; strcpy(sp->name,"システム手帳B-386"); sp->kakaku.teika=8500; sp->kakaku.waribiki=7900; sp->kakaku.yuutai=7600; sp->zaiko=32; printf("品名:%s\n",sp->name); printf("定価価格:%d\n",sp->kakaku.teika); printf("割引価格:%d\n",sp->kakaku.waribiki); printf("優待価格:%d\n",sp->kakaku.yuutai); printf("在庫個数:%d\n",sp->zaiko); } になってます。なんでじっこうできないんでしょうか?参考書では、ドット演算子を使ってたんですが、それをアロー演算子に直したつもりです。 よろしくお願いします。

  • ポインタについて

    今初めてポインタというものを勉強しております。 よろしくお願いします。 ◎1---------------------------------- #include<stdio.h> int main(void) { int mydt=1234; int *pt; pt=&mydt; printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } --------------------------------------- ◎1のようにmydtのアドレスをポインタptに代入すれば、このプログラムは正常に動きました。 ◎2----------------------------------- #include<stdio.h> int main(void) { int mydt=1234; int *pt=&mydt; printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } ---------------------------------------- ◎2で「int *pt=&mydt;」があまりどういう意味かはわかりませんが、これも正常に動きました。 ◎3------------------------------------ #include<stdio.h> int main(void) { int mydt=1234; int *pt; *pt=&mydt printf("*pt=%d\n",*pt); printf("&mydt=%p\n",&mydt); return 0; } -------------------------------------- ◎3のように◎2と違って「*pt=&mydt」の代入を後から行うと、「'=' : 'int *__w64 ' から 'int' に変換できません。」といったようなエラーが起きてしまいます。 ◎1と◎2の違い、後何故◎3はダメなのかがわかりません。 教えていただけると嬉しいです。 後補足として、配列とポインタについてですが、 ◎4------------------------------ char ss[10]="ABCDE"; char *ssp=ss; --------------------------------- ◎5---------------------------- char ss[10]="ABCDE"; char *ssp; ssp=ss; -------------------------------- ◎4と◎5も同じような事だとは思いますが違いを教えていただけると嬉しいです。 よろしくお願いします。

  • ポインタについて

    #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のアドレスを表示するようですが 他の三つは何を表示するのでしょうか? よければ詳しい説明をつけてくれるとうれしいです (~が~だから~と表示される)みたいなかんじで お願いします

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • ポインタ型配列のポインタを構造体のポインタ変数に格納する方法教えて!_ver2

    int型の配列は構造体のポインタ型のint型変数にはキャストすればうまくコンパイルが通りますが、同じ方法でfloat型の配列は構造体のポインタ型のfloat型変数にはキャストしてポインタの値を入れてもうまくコンパイルできず困っています。ちなみにコンパイルエラーは「互換でない型変換」と表示されます。 返答のほど、よろしくお願いいたします。 #include<stdio.h> #include<malloc.h> float time[] ={2.2, 2.3, 2.4}; int time2[] ={2, 2, 2}; struct timelist{ float *time; int *time2; struct timelist *next; }*head; void main(void) { struct timelist *p; p = (struct timelist *)malloc(sizeof(struct timelist)); p -> time = (float *)time[0]; p -> time2 = (int *)time2[0]; printf("time = %f\n", p -> time); printf("time2 = %d\n", p -> time2); }

  • インクリメント演算子について

    インクリメント演算子について プログラミング超初心者です。 大学のプログラミングの課題で インクリメント演算子を使って 数字をひとつずつ大きく(小さく)していくという課題が出ました 私が作ったプログラムは以下のとおりです #include <stdio.h> int main(void) { int x ; //変数宣言 printf("整数値を入力してください:"); scanf("%d",&x); printf("1ずつ増加\n"); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d\n",x); printf("1ずつ減少\n"); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d\n",x--); } ちなみに、整数値は10にしました。 結果は 1ずつ増加 10,11,12,13,14 1ずつ減少 14,13,12,11,10 と、望んでるものになったのですが、疑問があるので質問させていただきます。 xを変数にすると、x++はx+1になると思うのですが表示されたのは10、11、…と 10から表示されました。 しかも、増加していった最後のxはなぜ14になるのでしょうか? 課題は出来たのですが、頭が混乱しています… 詳しく解説をお願いします。

  • 4の倍数を論理演算で表す。。

    /*Prog32.cキーボードから整数型変数aへデータを入力し、aの値が4の倍数のときは“4の倍数です”と表示し、そうでないときは、“4の倍数ではありません”と表示する。ただし、整数データのビット数はわからないものとし、計算にはビットごとの論理演算のみを用いる。*/ #include <stdio.h> int main(void) { int a; printf("整数を入力して下さい! "); scanf("%d", &a); (a % 4 ) ? printf("4の倍数ではありません。\n", a) :printf("4の倍数です。\n", a); return(0); } 4の倍数を論理演算で表す方法がわかりません。。 自分では上記のように算術を使うやりかたしかわかりませんでした。 よろしくお願いします!

専門家に質問してみよう