C字符串指针与数组

Joh*_*Gee 8 c

可能重复:
C中的char s []和char*s有什么区别?

为什么是:

char *ptr = "Hello!"
Run Code Online (Sandbox Code Playgroud)

不同于:

char ptr[] = "Hello!"
Run Code Online (Sandbox Code Playgroud)

具体来说,我不明白为什么你可以使用(*ptr)++来改变数组中'H'的值,而不是指针.

谢谢!

Mic*_*urr 29

您可以(通常)使用表达式(*ptr)++来更改ptr指向何时ptr是指针而不是数组的值(即,如果ptr声明为char* ptr).

但是,在您的第一个示例中:

char *ptr = "Hello!"
Run Code Online (Sandbox Code Playgroud)

ptr 指向文字字符串,并且不允许修改文字字符串(它们实际上可以存储在不可写的存储区中,例如ROM或标记为只读的存储页).

在你的第二个例子中,

char ptr[] = "Hello!";
Run Code Online (Sandbox Code Playgroud)

声明了数组,初始化实际上将字符串文字中的数据复制到分配的数组内存中.那个数组内存是可以修改的,所以(*ptr)++有效.

注意:对于第二个声明,ptr标识符本身是数组标识符,而不是指针,并且不是'左值',因此无法修改(即使在大多数情况下它很容易转换为指针).例如,表达式++ptr无效.我认为这是其他一些答案试图提出的观点.

  • @John McGee:你发布了一个问题意味着你有一个"帐户",你有足够的声誉来支持,你总是可以将答案标记为"已接受". (5认同)

Pab*_*ruz 5

阅读C语言常见问题解答.特别是数组和指针部分.

  • @John McGee:关于字符串文字的问题也在常见问题解答中得到解答.我建议你阅读整个FAQ con C-lang.值得一读!从上到下.认真.这很好.祝你好运. (3认同)
  • @John McGee - @Pablo向您展示了一个很好的资源来回答这个问题,而且很可能会在未来提出更多问题.如果你愿意,教一个人钓鱼.一个更合适的反应可能是"我在那里找不到它,是否有一个我错过的具体例子?" (2认同)

amf*_*eng 0

数组自动分配空间,并且不能重新定位或调整大小,而指针被显式分配为指向已分配的空间并且可以重新定位。

数组名称是只读的