繁体   English   中英

有人可以澄清我对 C 字符串、arrays 与指针的混淆吗

[英]Could someone clarify this one confusion I have with C Strings, arrays versus pointers

只是一个简单的问题。

我会写

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

printf("%s", p);

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

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

使用正常的 arrays 和指针,如果你想缩放你做 *p++ 的数组,因为你正在遍历每个 memory 位置并打印它的值。 为什么你必须在那里 1 对 1 地遍历数组,而在这里它只是指向整个东西?

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

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

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

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

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

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

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

 char *p = string;

实际上相当于:

 char *p =  &string[0];

如果增加指针:

 p++;

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

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

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

为什么你必须在那里 1 对 1 地遍历数组,而在这里它只是指向整个东西?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM