“array[]”是什么意思?

3
在C语言中,如果我声明了类似以下的内容:
char *somarray[] = {"Hello"};

这是什么意思?

如果我打印它:

somarray -> 给我栈中的内存地址

&somarray -> 同样的东西,栈内存地址,但是...

*somarray -> 给我常量中的内存地址

实际上,我可以使用*somarray打印字符串。

到底发生了什么?


为什么这个问题被关闭了,理由是“不具有建设性”? - Dagoth Ulen
这个问题应该被标记为“重复”,而不是“不具建设性”。 - Adrian McCarthy
5个回答

7
< p > *array[] 表示指针数组,在你的这个例子中:

char *somarray[] = {"Hello"}; 

somarray[] 是一个 char* 类型的数组。该数组大小为 1,包含指向字符串 "Hello" 的地址,如下所示:

somarray[0] -----> "Hello"

somarray 表示数组中第一个元素的地址。

&somarray 表示数组的地址。

*somarray 表示第一个元素的值。

假设 "Hello" 字符串的地址为 201,数组 somarray 的地址为 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 返回相同的值,但语义上它们是不同的。一个是第一个元素的地址,另一个是整个数组的地址。阅读这个答案。


@DagothUlen 等一下,我会发布一个带有示例的链接,请阅读它。 - Grijesh Chauhan
@DagothUlen 请阅读我的这个答案 - Grijesh Chauhan
1
甚至更好,再次感谢 :) - Dagoth Ulen
@GrijeshChauhan,你说somearray包含arry中第一个元素的地址,但你又说它会返回423,这是怎么回事? - Maizere Pathak.Nepal
@Maizere Marizere 我说 somearray[] 包含了 "Hello" 的地址,注意 []。其次,我说 somearray 是第一个元素的地址,该数组的第一个元素是 somearray[],而且 somearray 的值为 243,这是正确的,因为第一个元素在 423 的位置,而数组从 423 的位置开始,所以第一个元素和数组的地址值相同,但从语义上讲两者是不同的。每个句子都在答案中是正确的。如果仍然无法理解,请阅读此答案祝你好运! - Grijesh Chauhan

4
你正在声明一个常量字符串数组,分配在堆栈上。
例如,你可以这样做:
char* strs[] = { "Hello", "world" };

然后strs[0] 指向常量字符串 "Hello",strs[1] 指向 "world"。

1
这是一组字符串数组。它与以下内容相同:
typedef char * string;
string somarray[] = {"Hello"};

也就是说,somarray 的每个元素都是一个字符串。字符串本质上是指向多个字符的指针。

1

我更喜欢将其阅读为

char* somearray[]

由于您正在创建指针数组。

somearray中的每个元素都指向一个char*。


0

你可能想要做的是这样的:

char somearray[] = {"Hello"};

你所做的是通过以下方式创建指向指针的指针:
char *somearray[] = {"Hello"};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接