回答編集履歴

2

アドレスを具体的に確認する方法を追加

2019/07/23 23:43

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  と仮定しました。それが「"Hello" と result変数の様子」図です。
34
34
 
35
- 実際のアドレスどこかはともかく、何か具体的なアドレスを与えないと説明が面倒なのでテキトーにアドレスを決めました(少し工夫すれば実際のアドレスを確認できる)。
35
+ 実際のアドレスどこかはともかく、何か具体的なアドレスを与えないと説明が面倒なのでテキトーにアドレスを決めました(少し工夫すれば実際のアドレスを確認できる)。
36
36
 
37
37
 
38
38
 
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- ここで** *result は result ポインタが指すメモリの値**で。 *result の値は 72 だということ。72 は 'H' という値なので、
81
+ ここで重要なのは** *result は result ポインタが指すメモリの値**であること。 *result の値は 72 です。72 は 'H' という値なので、
82
82
 
83
83
  printf("%s", 72); すなわち printf("%s", 'H'); という呼出しになります。
84
84
 
@@ -92,6 +92,64 @@
92
92
 
93
93
 
94
94
 
95
- 一方、printf("%s", result); は result の値 0x0006A004 を printf() に渡します。つまり printf("%s", 0x0006A004); です。文字列の先頭アドレスを渡すので、そこから順次 H, e, l, l, o という文字を表示できる・・・これは既にご理解いただけたようですが。
95
+ 一方、printf("%s", result); は result の値 0x0006A004 を printf() に渡します。つまり printf("%s", 0x0006A004); です。文字列の先頭アドレスを渡された printf() は、そこから順次 H, e, l, l, o という文字を表示できる・・・これは既にご理解いただけたようですが。
96
96
 
97
97
  メモリの図を描くと、こういうことも実感として理解できるし、ポインタの扱いで間違いが少なくなります。
98
+
99
+
100
+
101
+ P.S.
102
+
103
+ 少し工夫すれば実際のアドレスを確認できる・・・
104
+
105
+ printf() にはポインタの値(アドレス)を表示する %p という変換指定があります。これと sizeof 演算子を使って、4行追加してみました。result の値を表示すれば "Hello" 文字列リテラルのアドレスがわかります。
106
+
107
+
108
+
109
+ ```C
110
+
111
+ #include<stdio.h>
112
+
113
+
114
+
115
+ int main(void){
116
+
117
+ char *result;
118
+
119
+ result = "Hello";
120
+
121
+ printf("%s", result);
122
+
123
+
124
+
125
+ printf("\n\n");
126
+
127
+ printf("\"Hello\" is located at %p.\n", result); // 文字列リテラルの位置
128
+
129
+ printf(" result is located at %p.\n", &result); // 変数 result の位置
130
+
131
+ printf(" size of result is %d bytes.\n", sizeof(result));
132
+
133
+ return 0;
134
+
135
+ }
136
+
137
+ ```
138
+
139
+ 私の手元では、こんな表示になりました。
140
+
141
+ ```
142
+
143
+ Hello
144
+
145
+
146
+
147
+ "Hello" is located at 0x4006f4.
148
+
149
+ result is located at 0x7ffc337f9950.
150
+
151
+ size of result is 8 bytes.
152
+
153
+ ```
154
+
155
+ result変数のサイズが8なのは64bit環境であることを示してます。もちろんデバッガでも確認できます。具体的なアドレスを知れば、より深い理解につながります。例えば、関数内のローカル変数とグローバル変数ではアドレスが大きく違うはずです。こうした情報を元にメモリの図を描きなおしてみることをお勧めします。

1

4バイトのメモリアドレス、誤りを修正

2019/07/23 23:43

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  という意味です。
50
50
 
51
- 32bitコンピュータのアドレスは 32bit ですから、result 変数には4バイトが必要です(32bit = 8bit/byte * 4byte)。この例では 0x0C001248から0x0C001247番地までの4バイトをひとまとめに使って、ひとつのアドレスを記憶します。ポインタ変数とは、そういうものです。
51
+ 32bitコンピュータのアドレスは 32bit ですから、result 変数には4バイトが必要です(32bit = 8bit/byte * 4byte)。この例では 0x0C001248から0x0C00124B番地までの4バイトをひとまとめに使って、ひとつのアドレスを記憶します。ポインタ変数とは、そういうものです。
52
52
 
53
53
 
54
54