Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符串指针与数组_C - Fatal编程技术网

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:谢谢。更不用说常数字符串共享(即重用)的情况了,我认为这更常见。。。