const char* 有什么例外吗?

Are there any exceptions to const char*?

如果cstring是指针,那为什么可以直接取值呢?其次,为什么 ‍‍‍*cstring 的结果不等于整个字符串?三、cstring是一个指向常量字符的非常量指针,为什么要改变它的值而不改变它的地址呢?

#include <cstdio>
#include <conio.h>
#include <iostream>

using namespace std;

int main() 
{
    const char* cstring = "string";
    cout << cstring << endl << *cstring << endl << &cstring << endl;

    cstring = "foo";
    cout << cstring << endl << *cstring << endl << &cstring << endl;

    _getch();
    return 0;
}

If cstring is a pointer, then why can it get a value directly?

任何人都可以通过取消引用指针来获取指针指向的值。当您执行 std::cout << cstring 时就会发生这种情况。选择正确的重载打印由 cstring 表示的字符串,假设它是正确形成的、以 null 结尾的 C 风格字符串。

Secondly, Why wasn't the ‍‍‍*cstring's result equal to whole of string?

cstring是一个const char*,所以*cstring是一个const char。将其传递给 std::cout,它将调用打印一个 char 的重载。内部调用的函数甚至不知道这只是字符串中的一个 char.

Third, cstring is a non-constant pointer to a constant character, so why change its value and not change its address?

您不能更改变量的地址。 cstring 在堆栈中的固定位置。您更改 cstring 的值,这是它指向的字符串的地址(它现在指向一个不同的字符串,它具有不同的地址,"string" 当然仍然具有相同的地址).

您可能想尝试的是:

const char* cstring = "string";
std::cout << (void*)cstring << std::endl;
cstring = "foo";
std::cout << (void*)cstring << std::endl;

现在您可以看到不同的地址了。一个是"string"的地址,一个是"foo"的地址。

If cstring is a pointer, then why can it get a value directly?

coutoperator << for const char* 专门用于这种行为。它将指针视为以 NULL 结尾的字符串,并将打印它而不是指针值。对于不同的类型,您会得到不同的行为。对于 char* 你打印了整个字符串。

Why wasn't the ‍‍‍*cstring's result equal to whole of string?

这是因为 *cstring 的类型是 char 并且 operator << 只需打印一个字符即可正确运行。 const char*本质上是一个数组,char.An数组本质上是指向数组第一个元素的指针。如果您在指针上使用 * 运算符,您将访问指针指向的任何内容。如果它指向第一个元素,那么,你就得到了第一个元素。

Third, cstring is a non-constant pointer to a constant character, so why change its value and not change its address?

如你所说,cstring是指向常量数据的非常量指针。你不能改变它指向的地方(它是一个常量指针),但你可以用其他东西替换指向数据的内容。您指向相同的位置,但该单元格的内容发生了变化。