質問編集履歴

2

2018_0316_1935 誤字修正

2018/03/16 10:35

投稿

teityura
teityura

スコア84

test CHANGED
File without changes
test CHANGED
@@ -234,6 +234,6 @@
234
234
 
235
235
  return 0;
236
236
 
237
- }}
237
+ }
238
238
 
239
239
  ```

1

2018_0316_1907 の 追記

2018/03/16 10:35

投稿

teityura
teityura

スコア84

test CHANGED
File without changes
test CHANGED
@@ -119,3 +119,121 @@
119
119
  }
120
120
 
121
121
  ```
122
+
123
+
124
+
125
+ 下記追記(2018_0316_1907)
126
+
127
+
128
+
129
+ >**ドット演算子を使うべき場面で、アロー演算子を使っていること。**
130
+
131
+ ドット演算子を使うべき場面が分からなくなってきました...
132
+
133
+
134
+
135
+ 頭の整理のために下記のようなものを書いてみましたが、コメントの通り混乱しております。[Wandbox](https://wandbox.org/permlink/5l0qKwRi6vFJxNw0)
136
+
137
+
138
+
139
+ 1.warning: format '%p' expects argument が出ているのは
140
+
141
+ pdata[0],pdata[1],pdata[2]にアドレスが入ってないからでしょうか。
142
+
143
+
144
+
145
+ 2.*pdataというポインタ変数を宣言していますが、配列ではなく
146
+
147
+ pdataという配列を宣言していないのに、pdata[1]など、要素にアクセスしようとするとエラーになるのでしょうか。
148
+
149
+ pdata[1]はpdataに格納されたアドレスから1個分離れたアドレスではないのでしょうか。
150
+
151
+ pdata[0]がpdataに格納されたと同じにならないのはなぜでしょうか。
152
+
153
+
154
+
155
+ このあたりの解釈について、上手くまとまっているサイトなどはないでしょうか。
156
+
157
+
158
+
159
+ ```C言語
160
+
161
+ #include <stdio.h>
162
+
163
+ #include <string.h>
164
+
165
+
166
+
167
+ typedef struct student_tag {
168
+
169
+ char name[64];
170
+
171
+ int year;
172
+
173
+ char sex[64];
174
+
175
+ } student;
176
+
177
+
178
+
179
+ int main(void) {
180
+
181
+ student data[3];
182
+
183
+ student *pdata;
184
+
185
+ pdata = data;
186
+
187
+ printf("_data___ = %p\n", data); //先頭のアドレス
188
+
189
+ printf("pdata___ = %p\n", pdata); //先頭のアドレス
190
+
191
+ printf("&data[0] = %p\n", &data[0]); //先頭のアドレス
192
+
193
+ printf("pdata[0] = %p\n", pdata[0]); //先頭のアドレス+0個離れてるアドレスのはずなのに先頭のアドレス+0と違う?
194
+
195
+ printf("_data[0] = %p\n\n", data[0]); //pdata[0]と同じアドレス? そもそも何者?
196
+
197
+
198
+
199
+ printf("&data[1] = %p\n", &data[1]); //先頭のアドレス+1個離れたアドレス
200
+
201
+ printf("pdata[1] = %p\n", pdata[1]); //先頭のアドレス+1個離れてるアドレスのはずなのに先頭のアドレス+1と違う?
202
+
203
+ printf("_data[1] = %p\n\n", data[1]); //謎
204
+
205
+
206
+
207
+ printf("&data[2] = %p\n", &data[2]); //先頭のアドレスから2個離れたアドレス
208
+
209
+ printf("pdata[2] = %p\n", pdata[2]); //先頭のアドレス+2個離れてるアドレスのはずなのに先頭のアドレス+2と違う?
210
+
211
+ printf("_data[2] = %p\n\n", data[2]); //謎
212
+
213
+
214
+
215
+ //strcpy(data->name, "Mario"); //いける
216
+
217
+ //strcpy(data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない
218
+
219
+ //strcpy(&data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない
220
+
221
+ //strcpy(pdata[0]->name, "MARIO"); //構造体ポインタ変数名だけど、要素がついたらいけない? そういう決まり?
222
+
223
+ strcpy(pdata->name, "MARIO"); //いける
224
+
225
+ //printf("data[0]->name = %s\n",data[0]->name); //構造体ポインタ変数名じゃないからいけない
226
+
227
+ //printf("pdata[0]->name = %s\n",pdata[0]->name); //構造体ポインタ変数名なのになぜかいけない?
228
+
229
+ printf("data[0].name = %s\n",data[0].name); //いける
230
+
231
+ printf("pdata[0].name = %s\n",pdata[0].name); //いける
232
+
233
+
234
+
235
+ return 0;
236
+
237
+ }}
238
+
239
+ ```