teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

2018_0316_1935 誤字修正

2018/03/16 10:35

投稿

teityura
teityura

スコア84

title CHANGED
File without changes
body CHANGED
@@ -116,5 +116,5 @@
116
116
  printf("pdata[0].name = %s\n",pdata[0].name); //いける
117
117
 
118
118
  return 0;
119
- }}
119
+ }
120
120
  ```

1

2018_0316_1907 の 追記

2018/03/16 10:35

投稿

teityura
teityura

スコア84

title CHANGED
File without changes
body CHANGED
@@ -58,4 +58,63 @@
58
58
 
59
59
  return;
60
60
  }
61
+ ```
62
+
63
+ 下記追記(2018_0316_1907)
64
+
65
+ >**ドット演算子を使うべき場面で、アロー演算子を使っていること。**
66
+ ドット演算子を使うべき場面が分からなくなってきました...
67
+
68
+ 頭の整理のために下記のようなものを書いてみましたが、コメントの通り混乱しております。[Wandbox](https://wandbox.org/permlink/5l0qKwRi6vFJxNw0)
69
+
70
+ 1.warning: format '%p' expects argument が出ているのは
71
+ pdata[0],pdata[1],pdata[2]にアドレスが入ってないからでしょうか。
72
+
73
+ 2.*pdataというポインタ変数を宣言していますが、配列ではなく
74
+ pdataという配列を宣言していないのに、pdata[1]など、要素にアクセスしようとするとエラーになるのでしょうか。
75
+ pdata[1]はpdataに格納されたアドレスから1個分離れたアドレスではないのでしょうか。
76
+ pdata[0]がpdataに格納されたと同じにならないのはなぜでしょうか。
77
+
78
+ このあたりの解釈について、上手くまとまっているサイトなどはないでしょうか。
79
+
80
+ ```C言語
81
+ #include <stdio.h>
82
+ #include <string.h>
83
+
84
+ typedef struct student_tag {
85
+ char name[64];
86
+ int year;
87
+ char sex[64];
88
+ } student;
89
+
90
+ int main(void) {
91
+ student data[3];
92
+ student *pdata;
93
+ pdata = data;
94
+ printf("_data___ = %p\n", data); //先頭のアドレス
95
+ printf("pdata___ = %p\n", pdata); //先頭のアドレス
96
+ printf("&data[0] = %p\n", &data[0]); //先頭のアドレス
97
+ printf("pdata[0] = %p\n", pdata[0]); //先頭のアドレス+0個離れてるアドレスのはずなのに先頭のアドレス+0と違う?
98
+ printf("_data[0] = %p\n\n", data[0]); //pdata[0]と同じアドレス? そもそも何者?
99
+
100
+ printf("&data[1] = %p\n", &data[1]); //先頭のアドレス+1個離れたアドレス
101
+ printf("pdata[1] = %p\n", pdata[1]); //先頭のアドレス+1個離れてるアドレスのはずなのに先頭のアドレス+1と違う?
102
+ printf("_data[1] = %p\n\n", data[1]); //謎
103
+
104
+ printf("&data[2] = %p\n", &data[2]); //先頭のアドレスから2個離れたアドレス
105
+ printf("pdata[2] = %p\n", pdata[2]); //先頭のアドレス+2個離れてるアドレスのはずなのに先頭のアドレス+2と違う?
106
+ printf("_data[2] = %p\n\n", data[2]); //謎
107
+
108
+ //strcpy(data->name, "Mario"); //いける
109
+ //strcpy(data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない
110
+ //strcpy(&data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない
111
+ //strcpy(pdata[0]->name, "MARIO"); //構造体ポインタ変数名だけど、要素がついたらいけない? そういう決まり?
112
+ strcpy(pdata->name, "MARIO"); //いける
113
+ //printf("data[0]->name = %s\n",data[0]->name); //構造体ポインタ変数名じゃないからいけない
114
+ //printf("pdata[0]->name = %s\n",pdata[0]->name); //構造体ポインタ変数名なのになぜかいけない?
115
+ printf("data[0].name = %s\n",data[0].name); //いける
116
+ printf("pdata[0].name = %s\n",pdata[0].name); //いける
117
+
118
+ return 0;
119
+ }}
61
120
  ```