Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量字符*指针_C++_Pointers - Fatal编程技术网

C++ 常量字符*指针

C++ 常量字符*指针,c++,pointers,C++,Pointers,我不理解指针 const char* p = "Some text"; const char* q = "Some text"; if (p == q) cout << "\nSAME ADDRESS!"; cout << "\np = " << p; cout << "\nq = " << q; //same outputs "Some text" const char*p=“一些文本”; const char*q=“一些

我不理解指针

const char* p = "Some text";
const char* q = "Some text";
if (p == q)
    cout << "\nSAME ADDRESS!";
cout << "\np = " << p; 
cout << "\nq = " << q; //same outputs "Some text"
const char*p=“一些文本”;
const char*q=“一些文本”;
如果(p==q)
库特
在Visual studio 2015中,语法
如果(p==q)
不比较地址,则会比较值

它会比较地址。具有完全相同内容的字符串(或其他)文本将被优化为只实例化一次(在同一地址)

要检查实际地址,请使用以下语句

cout << (void*)p << ' ' << (void*)q << endl;

cout我想你把两个不同的概念混淆了。如果有任何类型的两个指针
p
q
,则
p==q
始终比较指针中存储的地址,而不是所指向的对象。因此,声明

if (p == q) 
if (p == q)
测试
p
q
是否直接指向同一对象。至于为什么要返回相同的对象,作为一种优化,许多编译器将把具有相同值的所有字符串文字汇集到一个字符串文字中,并设置所有指针来共享它。这种优化节省了二进制文件中的空间。这也是为什么写入字符串文字是未定义的行为——如果您可以写入字符串文字,那么您可能会意外地污染初始化为该文字的其他字符串

单独而言,streams库是专门编程的,因此如果您试图打印出
const char*
,它会将该
const char*
视为指向以null结尾的字符串开头的指针,然后打印出该字符串中的所有字符

如果要打印地址,可以先将指针强制转换为
void*

cout << static_cast<const void*>(p) << endl;
cout << static_cast<const void*>(q) << endl;

这是说,在C++中,你应该考虑使用<代码> STD::String 而不是<代码> const char */Cuth>,因为它更安全和更容易使用。

通常取决于编译器选项(实现定义)编译器是否将字符串字符串存储为一个字符串文字或分开。 所以对于这个代码片段

const char* p = "Some text";
const char* q = "Some text";
if (p == q)
if语句中的条件可以计算为true或false

<>从C++标准(2.145字符串文字)

12是否所有字符串文字都是不同的(即存储在 非重叠对象)是实现定义的。影响 试图修改字符串文字未定义

因此,在本声明中

if (p == q) 
if (p == q)

确实存在比较的指针,但比较的结果是由实现定义的,并且通常可以由程序员通过设置编译器选项来控制。

您如何知道它没有比较地址?(
=
永远不会比较两个C样式字符串的内容)@crashmstr,但它们的输出不是地址吗?
cout@crashmstr哇!非常感谢!我真傻!好吧,好吧。如何查看该地址?@JuliaStefanyshyna使用调试器或强制转换到
void*
,以便
cout
不会打印字符串的内容(通常需要)。@JuliaStefanyshyna有关详细信息,请参阅: