0

只是一个快速的问题。

我可以写

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

printf("%s", p);

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

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

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

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

4

4 回答 4

3

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

这是c中指针与数组的一个很好的解释:

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

于 2012-04-09T00:22:14.640 回答
2

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

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

现在数组的值是指向它的第一个元素的指针,所以这个声明:

 char *p = string;

实际上相当于:

 char *p =  &string[0];

如果增加指针:

 p++;

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

于 2012-04-09T00:24:07.897 回答
1

指向数组的指针实际上是指向第一个地址的指针...并且 printf 将从该地址开始扫描,直到找到空字符... %c 和 %s 在该行为上有所不同

于 2012-04-09T00:26:21.793 回答
1

你使用%s所以它打印直到它'\0'

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

在这里,您使用指向 char 的指针,并且想要打印字符串。所以没关系。假设,如果您使用指向 int 或其他类型的指针,这将不太有效。所以使用了类似的指针算术p++

于 2012-04-09T00:28:37.630 回答