指向字符串常量的指针[重复]
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 << reinterpret_cast<void*>(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
)。
来自<ostream>
头文件:
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 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )