在c中,如果我声明如下:
char *somarray[] = {"Hello"};
这是什么意思?
如果我打印它:
somarray
- >给我一个堆栈中的内存地址
&somarray
- >同样的事情,堆栈内存地址,但.. ..
*somarray
- >给我一个常量
我实际上可以使用*somarray
来打印字符串。
发生了什么事?
答案 0 :(得分:7)
*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
给出相同的值,但语义上两者都不同。一个是第一个元素的地址,另一个是数组的地址。 read this answer.
答案 1 :(得分:4)
你正在声明一个在堆栈上分配的常量字符串数组。
你可以这样做:
char* strs[] = { "Hello", "world" };
然后strs[0]
会指向常量字符串“Hello”,strs[1]
指向“world”。
答案 2 :(得分:1)
我更喜欢将其视为
char* somearray[]
因为你正在创建一个指针数组。
somearray中的每个元素都指向一个char *。
答案 3 :(得分:1)
这是一个字符串数组。它与此相同:
typedef char * string;
string somarray[] = {"Hello"};
也就是说,somarray的每个元素都是一个字符串。一个字符串,就是指向许多字符的指针。
答案 4 :(得分:0)
您可能想要做的是:
char somearray[] = {"Hello"};
你所做的是做一个指针指针:
char *somearray[] = {"Hello"};