C关于指针和数组的混淆

C关于指针和数组的混淆,c,C,a[2]和p[2]是否会获取相同的字符?两者都将具有相同的字符值。它们将获取的是一个字符大小的内存块,位于每个变量开头之后或内存中每个变量指向的地址之后的2个字符大小的步骤(此处为2个字节)。在这个例子中,这恰好是'L'i,但这在内存中不是相同的地址 因此,是的,在给出的示例中,它们将获取相同的字符。是 p[2]等于*(p+2) 应该注意,第一个“HELLO”可能存储在可写内存页中,而第二个“HELLO”可能存储在只读页中。这与您所在的编译器/平台密切相关。我想这取决于您使用的编译器,但答案可能

a[2]
p[2]
是否会获取相同的字符?

两者都将具有相同的字符值。

它们将获取的是一个字符大小的内存块,位于每个变量开头之后或内存中每个变量指向的地址之后的2个字符大小的步骤(此处为2个字节)。在这个例子中,这恰好是'L'i,但这在内存中不是相同的地址

因此,是的,在给出的示例中,它们将获取相同的字符。

p[2]等于*(p+2)


应该注意,第一个“HELLO”可能存储在可写内存页中,而第二个“HELLO”可能存储在只读页中。这与您所在的编译器/平台密切相关。

我想这取决于您使用的编译器,但答案可能是否定的

顺便说一下,您可以通过比较这两个字符的地址来轻松测试这一点。如果他们不同,那么:不


无论如何,你不应该依赖这个;)

在这两种情况下,它们都将获取一个
'L'
。但是,它与“L”不同。它们存放在不同的地方。这意味着如果比较它们的指针,它们将不相等。

您确定它们的内存地址不同吗?:)@尼克D:它一定不是同一个内存地址
a
是一个数组,包含字符串文字“HELLO”的副本,而
p
是指向字符串文字“HELLO”的指针。是。。因为它们是两种不同的自动有效性。一个是数组,另一个是指针。@Steve和@Dj:哦,你说得对。对不起,我的错误评论:-嗯,实际上,我的回答也可能有点误导。我的意思是,虽然返回的值在本例中是相同的,但内存地址不会,因此更改一个字符串不会更改另一个字符串。您是指内存中的值还是地址?。。。但是您应该假设已经分配了两个物理上独立的“HELLO”字符串。
char a[]="HELLO";
char *p="HELLO";
HELLO
  ^
*(p+2)