推断但未明确说明的重要一点:
根据您的问题,我猜您对 C 编程相当陌生,所以我想多解释一下您的情况。如果我弄错了,请原谅我;C 可能很难学习,主要是因为对底层机制的微妙误解,所以我喜欢让事情尽可能简单。
如您所知,当您编写 C 程序时,编译器会根据语法为您预先创建所有内容。当您在代码中的任何位置声明变量时,例如:
int x = 0;
编译器读取这行文本并对自己说:好的,我需要将当前代码范围内的所有出现替换为x
对我分配用于保存整数的内存区域的常量引用。
当你的程序运行时,这一行会导致一个新的动作:我需要设置x
引用int
value的内存区域0
。
请注意这里的细微差别:参考点所在的内存位置x
是恒定的(并且不能更改)。但是,x
可以更改点的值。您可以通过分配在代码中执行此操作,例如x = 15;
. 另请注意,单行代码实际上相当于编译器的两个单独命令。
当您有如下声明时:
char *name = "Tom";
编译器的过程是这样的:好的,我需要将当前代码范围中的所有出现替换为name
对我分配用于保存char
指针值的内存区域的常量引用。它确实如此。
但是还有第二步,这相当于:我需要创建一个常量数组,其中包含值 'T'、'o'、'm' 和NULL
。然后我需要用"Tom"
该常量字符串的内存地址替换代码的一部分。
当你的程序运行时,最后一步发生:将指向char
' 值的指针(不是常量)设置为自动创建的字符串的内存地址(它是常量)。
所以 achar *
不是只读的。只有 aconst char *
是只读的。但是在这种情况下,您的问题不是char *
s 是只读的,而是您的指针引用了只读的内存区域。
我提出这一切是因为理解这个问题是您从库中查看该函数的定义和自己理解问题与不得不问我们之间的障碍。我已经稍微简化了一些细节,希望让这个问题更容易理解。
我希望这可以帮到你。;)