3

在c中,如果我声明如下:

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

这是什么意思 ?

如果我打印它:

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

&somarray- >同样的事情,堆栈内存地址,但是..

*somarray-> 在常量中给我一个内存地址

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

到底是怎么回事?

4

5 回答 5

7

*array[]表示指针数组,在您的示例中:

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

somarray[]是 的数组char*。此数组大小为 1,并且包含字符串上的地址,"Hello"例如:

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

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

&somarray表示数组地址

*somarray表示第一个元素的值

假设"Hello"字符串的地址是例如 201,并且地址是数组somaaray423那么它看起来像:

+----+----+----+---+---+----+----+----+---+----+ 
| `H`| 'e'|'l'|'l'|'o'| '\0'|   
+----+----+----+---+---+----+----+----+---+---+----+  
 201   202  203 204 205 206  207   208 209 210  2
 ^
 | 
+----+----+
| 201     |
+----+----+
 423
somarray

和:

somarray423

&somarray423

*somarray201

需要注意 somarray&somarray给出相同的值,但在语义上两者是不同的。一个是第一个元素的地址,另一个是数组的地址。阅读这个答案。

于 2013-03-29T16:55:26.840 回答
4

您正在声明一个在堆栈上分配的常量字符串数组。

例如,您可以这样做:

char* strs[] = { "Hello", "world" };

然后strs[0]将指向常量字符串“Hello”和strs[1]“world”。

于 2013-03-29T16:55:17.153 回答
1

我更喜欢把它读成

char* somearray[]

因为您正在创建一个指针数组。

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

于 2013-03-29T16:55:46.153 回答
1

它是一个字符串数组。它与此相同:

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

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

于 2013-03-29T16:59:24.397 回答
0

您可能想要做的是:

char somearray[] = {"Hello"};

您所做的是通过执行以下操作创建指向指针的指针:

char *somearray[] = {"Hello"};
于 2013-03-29T16:56:04.723 回答