回答編集履歴
2
アドレスを具体的に確認する方法を追加
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 ポインタが指すメモリの値**で
|
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); です。文字列の先頭アドレスを渡
|
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バイトのメモリアドレス、誤りを修正
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
という意味です。
|
50
50
|
|
51
|
-
32bitコンピュータのアドレスは 32bit ですから、result 変数には4バイトが必要です(32bit = 8bit/byte * 4byte)。この例では 0x0C001248から0x0C00124
|
51
|
+
32bitコンピュータのアドレスは 32bit ですから、result 変数には4バイトが必要です(32bit = 8bit/byte * 4byte)。この例では 0x0C001248から0x0C00124B番地までの4バイトをひとまとめに使って、ひとつのアドレスを記憶します。ポインタ変数とは、そういうものです。
|
52
52
|
|
53
53
|
|
54
54
|
|