理解字符串数组C

理解字符串数组C,c,arrays,pointers,C,Arrays,Pointers,在C中,我可以声明一个字符串数组,如: char*hey[]={“你好”,“你好”,“再见”} 然后我可以迭代它并使用hey[0]和hey[1]打印元素 这是怎么回事?为什么我不需要执行*hey[0]来遵从它呢???因为*hey[0]将给您字符串中的第一个字符hey[0]因为C编程语言没有本机字符串类型,您拥有的是一个指向字符数组数组的指针(这些数组都是'\0',又称为null,终止的)。您的示例*hey[0]非常有效,实际上指向了“hi”中的字母“h” 如果要取消引用hey[0],确实需要使用

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

char*hey[]={“你好”,“你好”,“再见”}

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


这是怎么回事?为什么我不需要执行
*hey[0]
来遵从它呢???

因为
*hey[0]
将给您字符串中的第一个字符
hey[0]

因为C编程语言没有本机字符串类型,您拥有的是一个指向字符数组数组的指针(这些数组都是'\0',又称为null,终止的)。您的示例
*hey[0]
非常有效,实际上指向了“hi”中的字母“h”

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

在C语言中,说“一个字符串”通常与说“一个指向某些字符的指针,末尾有一个0”是一样的。因此,
char*
已经是一个字符串了。没有什么可以撤销的

(这并不完全正确,但已经足够近了)


同样,如果愿意,您可以取消对它的引用<代码>*hey[0]
将是“h”。

*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
替换hey,它只是
char**
而不是
char*
数组。指向一系列指针的指针(指向数组的指针)

one='i'
-我将取消引用
p指针
一次,转到第一个字符串
“hi”
,然后+1将一个元素带到字符
'i'

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

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

这是相当基本的,但是一开始可能会有点混乱,我建议您使用指针、数组和字符串,直到您对这些概念感到满意为止。

我认为这一点被否决了(不是由我记录在案),因为尽管这是一个公平的问题,这是一个非常基本的问题,有很多资源可供您找到答案,而无需有人亲手编写。