C++ 指针的值怎么可能是字符串?

C++ 指针的值怎么可能是字符串?,c++,pointers,C++,Pointers,例如: const char* f = "123"; 据我所知,f的值是地址。但是为什么呢?它不应该生成错误吗?指针的值不是字符串,而是字符串文本中第一个字符的内存地址 这是足够的信息,因为字符串文字以null结尾。 所发生的是在内存中创建一个大小为字符数+1的字符数组。数组中最后一个字符的值是“\0”,实际上所有位都是零,这表示字符串文字的结尾,因此按顺序读取该数组的代码知道没有通过该索引。指针的值不是字符串,而是字符串文字中第一个字符的内存地址 这是足够的信息,因为字符串文字以null结尾

例如:

const char* f = "123";

据我所知,f的值是地址。但是为什么呢?它不应该生成错误吗?

指针的值不是字符串,而是字符串文本中第一个字符的内存地址

这是足够的信息,因为字符串文字以null结尾。
所发生的是在内存中创建一个大小为字符数+1的字符数组。数组中最后一个字符的值是“\0”,实际上所有位都是零,这表示字符串文字的结尾,因此按顺序读取该数组的代码知道没有通过该索引。

指针的值不是字符串,而是字符串文字中第一个字符的内存地址

这是足够的信息,因为字符串文字以null结尾。 所发生的是在内存中创建一个大小为字符数+1的字符数组。数组中最后一个字符的值为“\0”,实际上所有位均为零,这表示字符串文字的结尾,因此按顺序读取该数组的代码知道没有通过该索引。

执行程序时,文字字符串123将从程序文件复制到进程的内存中。通常,文本被放在只读内存中。这就是为什么指向字符串文本时需要常量。f指向文本的第一个字符

const char *f = "123";
// f[0] is '1' 
// f[1] is '2' 
// f[2] is '3' 
// f[3] is '\0' 
执行程序时,文字字符串123从程序文件复制到进程的内存中。通常,文本被放在只读内存中。这就是为什么指向字符串文本时需要常量。f指向文本的第一个字符

const char *f = "123";
// f[0] is '1' 
// f[1] is '2' 
// f[2] is '3' 
// f[3] is '\0' 

甚至字符串文字也有一个内存地址。请看以下答案:它不是字符串。这是一个临时字符数组。像这样的字符串文本将放在可执行文件的只读数据段中,并且不会占用应用程序堆栈或堆上的空间。这就是C++为什么要让它成为const的原因。正如你所说的,我猜你可能在调试器中查看F。大多数调试器将char*解释为一种特殊类型,即字符串。如果f是int*,调试器会将f的值显示为地址,不会进行任何解引用,但由于它是char*,调试器可能会向您显示其解引用,ASCII中以nul char结尾的字符数组,尽管好的调试器也会以f显示char*地址值。即使字符串文字也有内存地址。请参阅以下答案:它不是字符串。这是一个临时字符数组。像这样的字符串文本将放在可执行文件的只读数据段中,并且不会占用应用程序堆栈或堆上的空间。这就是C++为什么要让它成为const的原因。正如你所说的,我猜你可能在调试器中查看F。大多数调试器将char*解释为一种特殊类型,即字符串。如果f是int*,调试器会将f的值显示为地址,并且不会进行任何解引用,但由于它是char*,调试器可能会以ASCII格式向您显示其解引用的、以nul char结尾的字符数组,尽管一个好的调试器也会以f格式显示char*地址值。语言指定了这一点。这就是123的意思。编译器怎么知道我的意思?通过相同的逻辑int*f=2应该意味着f是保存2的地址,但它不是。不,这不是相同的逻辑。2和2是两个不同的东西。您可以将字符串文字视为一种特殊情况。123的类型是const char[4]。这是一个大小为4的字符数组。您可以将其分配给指针,因为数组类型会衰减为指向第一个元素的指针。语言指定了这一点。这就是123的意思。编译器怎么知道我的意思?通过相同的逻辑int*f=2应该意味着f是保存2的地址,但它不是。不,这不是相同的逻辑。2和2是两个不同的东西。您可以将字符串文字视为一种特殊情况。123的类型是const char[4]。这是一个大小为4的字符数组。您可以将其分配给指针,因为数组类型会衰减为指向第一个元素的指针。