有人可以澄清我对C字符串,数组与指针的混淆

时间:2012-04-09 00:19:48

标签: c arrays string char

只是一个简单的问题。

我可以写

char string[] = "Hello world";
char *p = string;

printf("%s", p);

并打印Hello world作为输出。但指针如何在这里工作?

数组中的每个点都有一个单独的内存位置,对吧?所以字符串数组长12个,占用12个内存空间。我认为指针只能指向一个内存位置,而不是12.指针p如何实现这一点?

使用普通数组和指针,如果你想缩放数组,你需要* p ++,因为你要经历每个内存位置并打印它的值。为什么你必须在那里逐一遍历数组,但这里它只是指向整个事物?

在我看来,就像一个(int数组)你正在递增指针,因为每个指针只能指向一个内存位置,但是对于char数组,它可以以某种方式指向所有指针。

4 个答案:

答案 0 :(得分:3)

你是对的,指针只能指向一个内存位置。处理数组时,指针指向第一个元素的位置。当你使用printf时,它基本上取指针(指向字符串的第一个元素),并打印直到到达空终止字符\0

以下是对c:

中指针与数组的一个很好的解释

http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

答案 1 :(得分:2)

  

我认为指针只能指向一个内存位置,而不是12.指针p如何实现这一点?

p是指向char的指针,而不是指向数组的指针。它指向string数组的第一个元素。

现在,数组的值是指向其第一个元素的指针,因此声明:

 char *p = string;

实际上相当于:

 char *p =  &string[0];

如果增加指针:

 p++;

p将指向数组的下一个元素,即string[1]

答案 2 :(得分:1)

指向数组的指针实际上是指向第一个地址的指针...而printf将从该地址扫描,直到它找到null char ...%c和%s在该行为上有所不同

答案 3 :(得分:1)

您使用%s,因此会打印到'\0'

  

为什么你必须在那里逐一遍历数组,但在这里   只是指向整个事情?

在这里,您使用指向char的指针,并且您想要打印字符串。所以没关系。假设,如果您使用的是指向int或其他类型的指针,这将无法正常工作。所以使用像p++这样的指针算法。