理解字符串数组C.

时间:2013-12-05 04:53:03

标签: c arrays pointers

在C中,我可以声明一个字符串数组,如:

char *hey[] = {"hi", "hello", "bye"};

然后我可以迭代它并使用hey[0]hey[1]打印元素。

这是如何工作的?为什么我不需要做*hey[0]来尊重它?

4 个答案:

答案 0 :(得分:1)

因为*hey[0]会为您提供字符串hey[0]

中的第一个字符

答案 1 :(得分:1)

如果要取消引用hey[0],确实需要使用*hey[0]取消引用它。问题是你没有取消引用它。

在C语言中,说“一个字符串”通常与“指向一些最后带有0的字符的指针”相同。所以char*已经是一个字符串了。没有什么可以解除引用。

(这不完全正确,但足够接近)

同样,如果您愿意,可以取消引用它。 *hey[0]将是'h'。

答案 2 :(得分:1)

*hey[0]两次取消引用。

正如人们所解释的那样,字符串本质上是指向字符数组开头的指针,通常以空字符'\0'结尾。

数组实际上也只是指向元素列表开头的指针。

也许这有助于解释:

char *hey[] = {"hi", "yellow", "bye"};
char **pPointer = hey;
char one, two, three;

one = *(*pPointer+1);
two = **(pPointer+1);
three = *(pPointer[1]);

您会注意到我可以用pPointer取代它,这只是char**而不是char*数组。指向一系列指针(指向数组的指针)的指针。

one = 'i' - 我正在取消引用pPointer一次,转到第一个字符串"hi"然后+1将一个元素带到字符'i'

two = 'y' - pPointer+1将我带到'string'数组中的下一个元素,指向字符串“yellow”的指针,取消引用这将给我字符串“yellow”然后取消引用,给我字符'y'。在你的情况下,做pPoin

three = 'y' - 这只是为了表明*(pPointer+1)pPointer[1]相同。

这是相当基本的,但最初可能有点令人困惑,我建议你使用指针,数组和字符串,直到你对这些概念感到满意为止。

答案 3 :(得分:0)

因为C编程语言没有本机字符串类型,所以你拥有的是一个指向字符数组数组的指针(它们都是'\ 0',也就是null,终止)。您*hey[0]的示例完全有效,实际上指向“hi”中的字母“h”。