【问题标题】:C++ Pointers - C - Style Strings [duplicate]C++ 指针 - C - 样式字符串 [重复]
【发布时间】:2015-10-21 20:35:39
【问题描述】:

我对 C++ 还很陌生,当我阅读指针时,我有点困惑:

char str[] = "Alex"
char *ptr
ptr = str
cout << ptr

这给出了“Alex”字符串本身,而不是内存位置,而且,*ptr 会给你字母“A”。有人向我解释一下为什么会这样吗?

此外,除此之外。当我尝试打印时 cout &lt;&lt; *ptr 它给了我第一个字符的地址。这是为什么?,我期待的是第一个值

【问题讨论】:

    标签: c++ pointers visual-c++


    【解决方案1】:

    operator&lt;&lt; 有一个重载,它采用 ostreamcout 的类型)和 const char*

    该重载将const char* 参数视为空终止的C 字符串,并打印该指针指向的字符,直到找到终止的空字符。

    请注意,传递不指向空终止序列的chars 的char 指针会调用未定义的行为。

    当您只想输出内存地址时,为了规避这种行为,请先将指针转换为void*

    cout << static_cast<void*>(ptr); // outputs the address stored in 'ptr'
    

    【讨论】:

    • 你介意给我一个 void* 强制转换的例子吗?另外,在通常情况下,如果它的类型是“int”,cout
    • @rahul 当然,检查编辑。是的,char 指针是与 C 风格字符串兼容和易于使用的特例。对于所有其他类型的指针,地址将被打印。从技术上讲,您也可以将指针指向 void* 以外的其他内容,但为此目的,void* 被认为是最“中性”的。
    • 另外,除此之外。当我尝试打印 cout
    • @rahul 第一个值是什么意思?第一个是什么?
    • 对不起,我的意思是它只是给出一个随机地址。但如果你尊重一个指针,我会得到价值
    【解决方案2】:

    C 样式字符串只是 char 的 C 样式数组,所有语义都与 C 样式数组相关。

    iostream 在给定 char 指针时表现不同;如果你想打印地址,你应该先把它转换成void*

    【讨论】:

    • 你赢了 :) 我不够快...
    【解决方案3】:

    这是因为在 c++ 中您可以重载运算符,如下所示:

    ostream& operator<<(ostream& os, const char* p)
    {
        while (*p) cout<<*p++;
    }
    

    因为 char 数组是一种常见的字符串类型,所以它是用标准语言为您完成的。

    【讨论】:

      【解决方案4】:

      因为 C/C++ 中的字符串以 '\0' 结尾。输出将运行到下一个指针,直到它到达指向'\0' 的指针。

      ptr + 0 == 'A';
      ptr + 1 == 'l';
      ptr + 2 == 'e';
      ptr + 3 == 'x';
      ptr + 4 == '\0'; // stop, end of output
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多