为什么在动态数组中自动解除对 char 指针的引用
Why is a char pointer dereferenced automatically in a dynamic array
也许是个愚蠢的问题。当我cout
指向char数组的指针时,我以为它会打印一个地址;相反,它取消引用地址并打印实际值直到为空。
与 int 数组相反,它按照我的预期进行操作。它打印第一个元素的地址。
为什么打印指针时 char 元素被取消引用。
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << as << endl;
int* s = new int[100];
s[0] = 2;
cout << s << endl;
问这个是因为当我试图获取第一个 char 元素的地址时 a[0] = 'a';
。我必须将它存储在指向指针的指针中。这对我来说似乎很奇怪,但这不是重点。
char ** d = &as;
cout << d << "this is d" << endl;
它打印字符串,因为这是特定 operator<<
重载的定义 所做的 。如果要打印地址,请强制转换为 void *
:
cout << static_cast<void *>(as) << endl;
IOStreams 对 char*
(和 const char*
)进行了特殊处理,因此您可以毫不费力地打印 C 字符串:
std::cout << "hello world\n";
(请记住,字符串文字表达式在传递给 operator<<
时会立即衰减为 const char*
。)
如果你不想要这种行为,你可以转换为 void*
:
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << (void*)as << endl;
你的"fix"实际上是坏了,因为你打印的是指针as
的地址,而不是as
指向的数组元素的地址。这由您已经注意到的 char**
类型指示。
没有重载输出运算符 <<
打印任何 char
指针的地址,它将所有 char
指针视为字符串。如果要打印指针的地址,需要将其强制转换为void*
std::cout << "Address of string is " << static_cast<void*>(as) << '\n';
在旁注中,代码
char ** d = &as;
cout << d << "this is d" << endl;
将 而不是 打印字符串的地址,即包含在 as
中的指针,而是打印 where 变量 as
存储在内存中。不太一样。
char*
字符指针被 std::ostream
<<
运算符视为 C 风格的空终止字符串。你是对的,这是与其他指针类型不同的行为。
&a
不是指向 a[0]
的指针。它是一个指向 a
的指针,它本身就是一个指针。 a
实际上是指向 a[0]
的指针,相当于 &a[0]
.
<< 运算符被重载以获取 char*
并输出其内容,因为 int*
/int[]
.
没有这样的重载
也许是个愚蠢的问题。当我cout
指向char数组的指针时,我以为它会打印一个地址;相反,它取消引用地址并打印实际值直到为空。
与 int 数组相反,它按照我的预期进行操作。它打印第一个元素的地址。
为什么打印指针时 char 元素被取消引用。
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << as << endl;
int* s = new int[100];
s[0] = 2;
cout << s << endl;
问这个是因为当我试图获取第一个 char 元素的地址时 a[0] = 'a';
。我必须将它存储在指向指针的指针中。这对我来说似乎很奇怪,但这不是重点。
char ** d = &as;
cout << d << "this is d" << endl;
它打印字符串,因为这是特定 operator<<
重载的定义 所做的 。如果要打印地址,请强制转换为 void *
:
cout << static_cast<void *>(as) << endl;
IOStreams 对 char*
(和 const char*
)进行了特殊处理,因此您可以毫不费力地打印 C 字符串:
std::cout << "hello world\n";
(请记住,字符串文字表达式在传递给 operator<<
时会立即衰减为 const char*
。)
如果你不想要这种行为,你可以转换为 void*
:
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << (void*)as << endl;
你的"fix"实际上是坏了,因为你打印的是指针as
的地址,而不是as
指向的数组元素的地址。这由您已经注意到的 char**
类型指示。
没有重载输出运算符 <<
打印任何 char
指针的地址,它将所有 char
指针视为字符串。如果要打印指针的地址,需要将其强制转换为void*
std::cout << "Address of string is " << static_cast<void*>(as) << '\n';
在旁注中,代码
char ** d = &as;
cout << d << "this is d" << endl;
将 而不是 打印字符串的地址,即包含在 as
中的指针,而是打印 where 变量 as
存储在内存中。不太一样。
char*
字符指针被 std::ostream
<<
运算符视为 C 风格的空终止字符串。你是对的,这是与其他指针类型不同的行为。
&a
不是指向 a[0]
的指针。它是一个指向 a
的指针,它本身就是一个指针。 a
实际上是指向 a[0]
的指针,相当于 &a[0]
.
<< 运算符被重载以获取 char*
并输出其内容,因为 int*
/int[]
.