cで、次のようなものを宣言すると:
char *somarray[] = {"Hello"};
どういう意味ですか ?
私がそれを印刷する場合:
somarray
->スタック内のメモリアドレスを教えてくれます
&somarray
- >同じこと、スタックメモリアドレスですが..
*somarray
-> 定数のメモリアドレスを教えてくれます
実際に*somarray
文字列を印刷するために使用できます。
何が起こっている?
*array[]
あなたの例では、ポインタの配列を意味します:
char *somarray[] = {"Hello"};
somarray[]
の配列ですchar*
。この配列のサイズは 1 で、"Hello"
次のような文字列にアドレスが含まれています。
somarray[0] -----> "Hello"
somarray
配列の最初の要素のアドレスを意味します。
&somarray
配列アドレスを意味します
*somarray
最初の要素の値を意味します
"Hello"
文字列のアドレスがたとえば 201 で、配列somaaray
がアドレスであると仮定すると423
、次のようになります。
+----+----+----+---+---+----+----+----+---+----+
| `H`| 'e'|'l'|'l'|'o'| '\0'|
+----+----+----+---+---+----+----+----+---+---+----+
201 202 203 204 205 206 207 208 209 210 2
^
|
+----+----+
| 201 |
+----+----+
423
somarray
と:
somarray
与える423
&somarray
与える423
*somarray
与える201
注意点 somarray
と&somarray
同じ値を与えますが、意味的には両方が異なります。1 つは最初の要素のアドレスで、もう 1 つは配列のアドレスです。この答えを読んでください。
スタックに割り当てられた定数文字列の配列を宣言しています。
たとえば、これを行うことができます:
char* strs[] = { "Hello", "world" };
次に、定数文字列「Hello」と「world」strs[0]
を指します。strs[1]
文字列の配列です。これと同じです:
typedef char * string;
string somarray[] = {"Hello"};
つまり、somaarray の各要素は文字列です。文字列は、多くの文字へのポインタです。
私はそれを次のように読むことを好みます
char* somearray[]
ポインターの配列を作成しているためです。
somearray の各要素は char* を指します。
おそらくやりたかったことはこれです:
char somearray[] = {"Hello"};
あなたがしたことは、次のようにしてポインターへのポインターを作成することです。
char *somearray[] = {"Hello"};