只是一个简单的问题。
我可以写
char string[] = "Hello world";
char *p = string;
printf("%s", p);
并打印Hello world
作为输出。但指针如何在这里工作?
数组中的每个点都有一个单独的内存位置,对吧?所以字符串数组长12个,占用12个内存空间。我认为指针只能指向一个内存位置,而不是12.指针p如何实现这一点?
使用普通数组和指针,如果你想缩放数组,你需要* p ++,因为你要经历每个内存位置并打印它的值。为什么你必须在那里逐一遍历数组,但这里它只是指向整个事物?
在我看来,就像一个(int数组)你正在递增指针,因为每个指针只能指向一个内存位置,但是对于char数组,它可以以某种方式指向所有指针。
答案 0 :(得分:3)
你是对的,指针只能指向一个内存位置。处理数组时,指针指向第一个元素的位置。当你使用printf
时,它基本上取指针(指向字符串的第一个元素),并打印直到到达空终止字符\0
。
以下是对c:
中指针与数组的一个很好的解释答案 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++
这样的指针算法。