我正在学习指针,这是我的代码。我定义了一个指向char(实际上是字符串)*str
的指针和一个指向int *a
的指针,它们以相同的方式定义。我认为str
和a
都应该是一个地址,但当我尝试输出str
和&str
,a
和&a
时,我发现str不是地址,而是字符串。根据{{1}}和*str
的类型,char *a
和int str
之间有什么区别?谢谢。
a
这是输出:
#include<iostream>
#include<string>
using namespace std;
int main()
{
char *str = "FA";
cout << "str: " << str << endl;
cout << "&str: " << &str << endl;
int b = 5;
int *a = &b;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
}
答案 0 :(得分:4)
嗯,这归结为C语义。字符串不是C中定义的类型。char
是单个字符的类型。为了处理C中的字符串,按照惯例,指向char
的指针表示一个字符串,该字符串从该指针指向的位置开始,并以第一个0
字节结束。
说清楚:
char *str = "ABC";
“翻译”为类似
的内容const char <nosymbol>[4] = {'A', 'B', 'C', '\0'};
char *str = &(<nosymbol>[0]);
C ++知道char *
的这种特殊含义,因此<<
运算符将遵循C程序员的最少意外原则,取char *
}作为一个字符串。
答案 1 :(得分:3)
流的<<
运算符有char *
的重载,它输出C样式的字符串。这通常是您想要的,但如果不是您想要的,您可以使用reinterpret_cast<void*>
或addressof
。