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?
cout
的 operator <<
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
是指向常量数据的非常量指针。你不能改变它指向的地方(它是一个常量指针),但你可以用其他东西替换指向数据的内容。您指向相同的位置,但该单元格的内容发生了变化。
如果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?
cout
的 operator <<
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
是指向常量数据的非常量指针。你不能改变它指向的地方(它是一个常量指针),但你可以用其他东西替换指向数据的内容。您指向相同的位置,但该单元格的内容发生了变化。