質問編集履歴
2
2018_0316_1935 誤字修正
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 の 追記
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
|
+
```
|