C字符串指针与数组

时间:2010-07-08 19:38:53

标签: c

  

可能重复:
  What is the difference between char s[] and char *s in C?

为什么:

char *ptr = "Hello!"

不同于:

char ptr[] = "Hello!"

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

谢谢!

6 个答案:

答案 0 :(得分:27)

您可以(通常)使用表达式(*ptr)++来更改ptr指向ptr是指针而非数组的值(即,如果{{1}声明为ptr)。

然而,在你的第一个例子中:

char* ptr

char *ptr = "Hello!" 指向文字字符串,不允许修改文字字符串(它们实际上可能存储在不可写的存储区中,例如ROM或标记为只读的存储页)

在你的第二个例子中,

ptr

声明数组,初始化实际上字符串文字中的数据复制到已分配的数组内存中。该数组内存是可修改的,因此char ptr[] = "Hello!"; 可以工作。

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

答案 1 :(得分:7)

阅读C语言常见问题解答。特别是array and pointers sections

答案 2 :(得分:0)

数组自动分配空间,当指针被明确指定为指向已分配的空间并且可以重新定位时,它们无法重新定位或调整大小。

数组名称​​只读

答案 3 :(得分:0)

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

声明

char *ptr = "Hello!";

定义一个指向char的指针,并通过存储文字开头的地址(前面提到的7个字符的数组)来初始化它。更改ptr指向的内存内容是非法的。

声明

char ptr[] = "Hello!";

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

答案 4 :(得分:0)

C字符串中的

是字符数组。 指针是包含另一个变量的内存位置的变量。 数组是一组有序数据项。 当你输入(* ptr)++时,你会用指针获得Segmentation Fault。

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

答案 5 :(得分:0)

当指向字符串文字时,你不应该声明字符是可修改的,并且一些编译器会警告你:

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

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

正确的“注释”是为了确保你有一个指向常量char的指针:

const char *ptr = "Hello!"

现在您直接看到您无法修改存储在指针处的文本。