在C中,我可以声明一个字符串数组,如:
char *hey[] = {"hi", "hello", "bye"};
然后我可以迭代它并使用hey[0]
和hey[1]
打印元素。
这是如何工作的?为什么我不需要做*hey[0]
来尊重它?
答案 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”。