可能重复:
What is the difference between char s[] and char *s in C?
为什么:
char *ptr = "Hello!"
不同于:
char ptr[] = "Hello!"
具体来说,我不明白为什么你可以使用(* ptr)++来改变数组中'H'的值,而不是指针。
谢谢!
答案 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)
是字符数组。 指针是包含另一个变量的内存位置的变量。 数组是一组有序数据项。 当你输入(* ptr)++时,你会用指针获得Segmentation Fault。
也许您在整个字符串中添加1(使用指针),而不是将1添加到变量的第一个字符(使用数组)。
答案 5 :(得分:0)
当指向字符串文字时,你不应该声明字符是可修改的,并且一些编译器会警告你:
char *ptr = "Hello!" /* WRONG, missing const! */
原因如其他人所指出的那样,字符串文字可能存储在程序内存的不可变部分中。
正确的“注释”是为了确保你有一个指向常量char的指针:
const char *ptr = "Hello!"
现在您直接看到您无法修改存储在指针处的文本。