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