这两行代码是否达到了相同的结果?如果我在函数中有这些行,那么字符串是否在两种情况下都存储在堆栈中?除了不需要在第一行代码中声明空终止符之外,我是否有充分的理由使用一个而不是另一个?
char s[] = "string";
char* s = "string\0";
不,这两条线没有达到相同的结果。
char s[] = "string"
生成一个 7 字节的可修改数组,该数组最初填充了内容's' 't' 'r' 'i' 'n' 'g' '\0'
(所有内容在运行时从字符串文字复制过来)。
char *s = "string"
导致指向一些包含字符串文字“字符串”的只读内存的指针。
如果要修改字符串的内容,那么第一个是唯一的方法。如果您只需要对字符串进行只读访问,那么第二个会稍微快一些,因为不必复制字符串。
在这两种情况下,都不需要在字符串文字中指定空终止符。编译器会在遇到关闭时为您解决这个问题。
这两者的区别:
char a[] = "string";
char* b = "string";
是 a 实际上是堆栈上的静态数组,而 b 是指向常量的指针。您可以修改 a 的内容,但不能修改 b。
除了其他答案之外,我将尝试解释为什么您不能*s
稍后在程序流程中修改变量。
从概念上讲,当程序加载到内存中时,它有 3 个区域(段):
在您的情况下,s[]
变量是函数中的局部变量(数组),main()
它使用 value 初始化"string"
。因此,它存储在堆栈中并且可以修改。
*s
变量是一个指向地址的指针 ,"string\0"
一个位于代码段中的常量。作为只读区域,您无法修改其内容。