指向字符串常量的指针[重复]

Posted

技术标签:

【中文标题】指向字符串常量的指针[重复]【英文标题】:Pointer to string constants [duplicate] 【发布时间】:2019-07-13 05:39:14 【问题描述】:

根据定义

char *str = "ankit"

这里str是一个指向char的指针。

当我们做类似的事情时

cout<< str;

然后它正在打印 ankit。为什么不是存储ankit的地址,因为str是一个指针所以它必须是一个地址

我尝试打印*str,结果是“a”;我可以理解,但我无法理解为什么打印 str 不是给出指针而是给出字符串值。

char * str = "ankit";
cout<< str;

输出:ankit

【问题讨论】:

看看如果你这样做cout &lt;&lt; reinterpret_cast&lt;void*&gt;(str);会发生什么。另见Why does my pointer output a string and not a memory address in C++? 和cout << with char* argument prints string, not pointer value。 蓝精灵。我应该意识到这个问题得到了回答并再次得到了回答。 有趣的旁注:根据 C++11 标准和后续 C++ 标准,char * str = "ankit"; 是非法的。字符串字面量是字符的常量数组,不允许使用非常量指针指向常量数据,以防止写入常量数据时发生意外。 【参考方案1】:

ostream 对 char *T * 有不同的重载(对于模板类型 T)。

来自&lt;ostream&gt; 头文件:

template <class _Traits>
inline basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& _Ostr,
    const char* _Val)  // insert NTBS into char stream
template <class _Ostr, class _Ty,
    enable_if_t<conjunction_v< // prevent infinite recursion
                    negation<is_lvalue_reference<_Ostr>>, is_base_of<ios_base, _Ostr>, _Can_stream_out<_Ostr, _Ty>>,
        int> = 0>
inline _Ostr&& operator<<(_Ostr&& _Os, const _Ty& _Val)  // insert to rvalue stream

如果给出已知的 C 字符串,则将使用接受 char * 参数的函数。

如果不可用,则使用其他接受任意指针值的函数。

还有一个接受void *指针的方法。

【讨论】:

以上是关于指向字符串常量的指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥新的 Visual Studio 将字符串文字作为指向常量的指针?

Long 指向常量宽字符串的指针,这里的 Long 的作用是啥?

C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

字符串比较字符指针和字符串的存储位置

C 语言数组 ( 指针数组用法 | 菜单选择 )

常量指针的混淆[重复]