C字符串指针与数组


C strings pointer vs. arrays

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the difference between char s[] and char *s in C?

为什么是:

1
char *ptr ="Hello!"

不同于:

1
char ptr[] ="Hello!"

具体来说,我不明白为什么可以使用(*ptr)++来更改数组中"h"的值,但不能更改指针。

谢谢!


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

但是,在第一个示例中:

1
char *ptr ="Hello!"

ptr指向的是一个文本字符串,不允许修改文本字符串(它们实际上可能存储在不可写的内存区域中,如只读存储器或标记为只读的内存页)。

在第二个例子中,

1
char ptr[] ="Hello!";

数组被声明,初始化实际上将字符串文字中的数据复制到分配的数组内存中。这个数组内存是可修改的,所以(*ptr)++工作。

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


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


当指向字符串文字时,不应将字符声明为可修改的,并且某些编译器将为此警告您:

1
char *ptr ="Hello!"    /* WRONG, missing const! */

原因是,正如其他人所指出的,字符串文本可能存储在程序内存的不可变部分中。

正确的"注释"是确保您有一个指向常量char的指针:

1
const char *ptr ="Hello!"

现在您可以直接看到,您不能修改指针处存储的文本。


在C字符串中是字符数组。指针是包含另一个变量的内存位置的变量。数组是一组有序的数据项。当您输入(*ptr)++时,指针会出现分段错误。

也许您是在整个字符串中添加1(使用指针),而不是在变量的第一个字符中添加1(使用数组)。


如果使用字符串文字"Hello!",则文字本身将成为一个7个字符的数组,并存储在数据内存的某个位置。那个内存可能是只读的。

声明

1
char *ptr ="Hello!";

定义指向char的指针,并通过在其中存储文本开头的地址(前面提到的由7个字符组成的数组)对其进行初始化。更改ptr指向的内存内容是非法的。

声明

1
char ptr[] ="Hello!";

定义char数组(char ptr[7]并通过将字符从文本复制到数组来初始化它。可以修改数组。


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

数组名是只读的!