在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
给出相同的值,但在语义上两者是不同的。一个是第一个元素的地址,另一个是数组的地址。阅读这个答案。
您正在声明一个在堆栈上分配的常量字符串数组。
例如,您可以这样做:
char* strs[] = { "Hello", "world" };
然后strs[0]
将指向常量字符串“Hello”和strs[1]
“world”。
我更喜欢把它读成
char* somearray[]
因为您正在创建一个指针数组。
somearray 中的每个元素都指向一个 char*。
它是一个字符串数组。它与此相同:
typedef char * string;
string somarray[] = {"Hello"};
也就是说,somarray 的每个元素都是一个字符串。一个字符串,就地是一个指向许多字符的指针。
您可能想要做的是:
char somearray[] = {"Hello"};
您所做的是通过执行以下操作创建指向指针的指针:
char *somearray[] = {"Hello"};