C字符串指针与数组
可能重复:C字符串指针与数组,c,C,可能重复: 原因是: char *ptr = "Hello!" 不同于: char ptr[] = "Hello!" 具体来说,我不明白为什么可以使用(*ptr)++来更改数组中“H”的值,但不能更改指针 谢谢 数组自动分配空间,当指针被显式分配给指向分配的空间并可以重新定位时,它们不能重新定位或调整大小 数组名称是只读的 当ptr是指针而不是数组时(即,如果ptr声明为char*ptr),可以(通常)使用表达式(*ptr)+更改ptr指向的值 但是,在第一个示例中: char *ptr
原因是:
char *ptr = "Hello!"
不同于:
char ptr[] = "Hello!"
具体来说,我不明白为什么可以使用(*ptr)++来更改数组中“H”的值,但不能更改指针
谢谢 数组自动分配空间,当指针被显式分配给指向分配的空间并可以重新定位时,它们不能重新定位或调整大小 数组名称是只读的 当
ptr
是指针而不是数组时(即,如果ptr
声明为char*ptr
),可以(通常)使用表达式(*ptr)+
更改ptr
指向的值
但是,在第一个示例中:
char *ptr = "Hello!"
ptr
指向文本字符串,不允许修改文本字符串(它们实际上可能存储在不可写的内存区域中,例如ROM或标记为只读的内存页)
在你的第二个例子中
char ptr[] = "Hello!";
数组被声明,初始化实际上将字符串文本中的数据复制到分配的数组内存中。该阵列内存是可修改的,因此(*ptr)+
可以工作
注意:对于第二个声明,
ptr
标识符本身是数组标识符,不是指针,也不是“左值”,因此无法修改(即使在大多数情况下它很容易转换为指针)。例如,表达式++ptr
将无效。我想这正是其他一些答案试图表达的观点。如果使用字符串文字“Hello!”
,文字本身将成为一个7个字符的数组,并存储在数据内存中的某个位置。该存储器可能是只读的
声明
char *ptr = "Hello!";
char ptr[] = "Hello!";
定义指向char
的指针,并通过在其中存储文本开头的地址(前面提到的7个字符的数组)对其进行初始化。更改由ptr
指向的内存内容是非法的
声明
char *ptr = "Hello!";
char ptr[] = "Hello!";
定义
char
数组(char ptr[7]
)并通过将字符从文本复制到数组来初始化它。数组可以修改。在C字符串中是字符数组。
指针是包含另一个变量的内存位置的变量。
数组是一组有序的数据项。
当您输入(*ptr)++时,指针会出现分段错误
可能是将1添加到整个字符串(使用指针),而不是将1添加到变量的第一个字符(使用数组)。当指向字符串文字时,不应声明字符是可修改的,一些编译器会就此向您发出警告:
char *ptr = "Hello!" /* WRONG, missing const! */
原因正如其他人所指出的,字符串文本可能存储在程序内存的不可变部分中
正确的“注释”是确保您有一个指向常量字符的指针:
const char *ptr = "Hello!"
现在您可以直接看到,无法修改存储在指针处的文本。谢谢,但它没有回答我的问题。我在问为什么(*ptr)++对于数组,会将“H”改为“I”,而对于另一种情况,则不会。最后,有人回答了我的问题。如果我有一个注册账户,我会给你一票。谢谢你,好心的先生。@John McGee:你发布了一个问题,这意味着你有一个“帐户”,你有足够的声誉去投票,而且你总是可以将答案标记为“已接受”。我现在懒得尝试,但在第一种情况下(*ptr)++真的会导致编译器错误吗?编译器需要分析ptr在初始化后是否没有改变,不是吗?@Martin:通常不会导致编译时错误(如果您的编译器很聪明,并且可以检测到
ptr
指向文本,则可能会发出警告),但它通常会导致运行时错误。不过,它可能在某些平台上工作,但这是未定义的行为,在任何平台上都应视为bug。@Michael:谢谢。更不用说常数字符串共享(即重用)的情况了,我认为这更常见。。。