【问题标题】:Making strings by pointers通过指针创建字符串
【发布时间】:2012-08-03 15:00:07
【问题描述】:

我了解到一个指针指向一个内存地址,因此我可以使用它来更改在该地址设置的值。像这样:

int *pPointer = &iTuna;

pPointer这里有iTuna的内存地址。所以我们可以使用pPointer 来改变iTuna 的值。如果我打印pPointer,则内存地址被打印,如果我打印*pPointer,则iTuna 的值被打印

现在看这个节目

    char* pStr= "Hello !";
cout<< pStr << endl;
cout<< *pStr << endl;
system("PAUSE");
return 0;

这里有很多我不明白的东西:

  1. 在“你好!”中每个字母单独存储,一个指针保存一个内存地址。那么pStr如何指向所有的字母呢。

  2. 另外,当我打印出pStr 时,它会打印出Hello !,而不是内存地址。

  3. 当我打印出*pStr 时,它只会打印出H,而不仅仅是pStr 指向的所有内容。

我真的无法理解,这些都是我的担忧。我希望有人可以向我解释这是如何工作的广告帮助我理解

【问题讨论】:

  • 请去掉system("pause")
  • 我不太喜欢那篇文章,因为如果 cin.get() 或 getchar() 在输入操作后不会暂停,初学者(最有可能的观众)会发现自己很困惑。
  • char* pStr= "Hello !"; 已弃用,请使用 char const*
  • @Cubic,是的,您必须通过使用其中的一个或两个来解决它,或者您可以在调用cin.get 之前依赖cin.sync 的非保证行为。或者您可以像普通控制台应用程序一样使用它,而不是尝试使其成为独立应用程序。

标签: c++ string pointers


【解决方案1】:
  1. "Hello !" 是一个char const[8] 类型和值{ 'H', 'e', 'l', 'l', 'o', ' ', '!', 0 }数组pStr 是指向其第一个元素的指针;它的最后一个元素的值为0

  2. iostreams 库中有一个char const * 参数的重载,它将参数视为指向数组第一个元素的指针,并打印每个元素,直到它遇到零。 (口语中的“空终止字符串”。)

  3. 解除指向数组第一个元素的指针会给你数组的第一个元素,即'H'。这与pStr[0] 相同。

【讨论】:

  • 很好的答案。一件事,你的意思是 iostreams 库中有一个 char2 参数的重载
  • @MohamedAhmedNabil:有一个简单的重载定义namespace std { ostream &amp; operator&lt;&lt;(ostream &amp; o, char const * s); },它被实现为for ( ; *s; ++s) { o &lt;&lt; *s} return o;。当您说std::cout &lt;&lt; pStr; 时,将调用重载,即实际调用是operator&lt;&lt;(std::cout, pStr)
  • char const, char const
  • @Xeo:当然。 说了什么?
  • 你错过了字符串字面量类型。
【解决方案2】:

1-) 由于pStr指向一个char,它实际上指向一个null terminated string的数组的开头

2-) coutchar * 参数重载。它将打印出字符串中的任何字符,直到到达null character

3-) 您正在取消引用指向字符数组第一个元素的指针。

【讨论】:

    【解决方案3】:

    1-) 在“你好!”每个字母单独存储,一个指针保存 一个内存地址。那么 pStr 是如何指向所有字母的呢。

    字母按顺序存储在每个存储单元中,并带有一个额外的最后一个单元 按住 0 表示结束。

    2-)此外,当我打印出 pStr 时,它会打印 Hello !不是内存地址。

    cout &lt;&lt; 知道您指向一个字符串,因此会打印该字符串。

    3-)当我打印出 *pStr 时,它只打印出 H 而不是 pStr 的全部内容 也指向了。

    * 表示您正在询问该地址的值。 cout &lt;&lt; 知道该地址包含一个字符,因此打印该字符。

    【讨论】:

      【解决方案4】:

      你对指针的理解在各方面都是正确的。

      您的问题是

      类似地,

      【讨论】:

      • “覆盖”是什么意思?
      • 在 c++ 中可以为特定类型重载运算符(如 + 或 >>):en.wikipedia.org/wiki/…
      【解决方案5】:
      1. 您还需要了解字符串的概念。在 C 和 C++ 中,字符串是在内存中一个接一个地定位的几个字符(char),基本上是 'H','e','l','l','o','\0'。您的指针保存第一个符号的内存地址,并且您的 C++ 库知道字符串是从该地址开始并以 '\0' 结尾的所有内容。

      2. 当您将 char* 传递给 cout 时,它会知道您输出的是字符串,并将其打印为字符串。

      3. 构造 *pStr 的意思是“给我任何位于存储在 pStr 中的地址的东西”。那将是 char - 单个字符 - 'H',然后将其传递给 cout,并且您只会打印一个字符。

      【讨论】:

        【解决方案6】:
        1. 一个指针,*pStr 指向一个特定的内存地址,但该内存地址不仅可以用作单个元素,即char,还可以用作数组的开头 个这样的元素,或者一块内存。

        2. char 数组是 C 中的一种特殊类型的数组,因为某些操作以特定方式处理它们:作为 字符串。因此,printf("%s", ...cout 知道,当给定char * 时,它们应该查找一个字符串,并打印所有字符,直到终止null 字符。此外,C 提供了一个字符串库,其中包含旨在将char * 作为字符串进行操作的函数。

        3. 此行为与您从自己的分析中所期望的一样:取消引用 pStr 只是为您提供内存地址处的值,在本例中为 chars 数组的第一个元素记忆。

        【讨论】:

          【解决方案7】:
          1. 指向数组的指针(C 风格的字符串是 char 数组)只是指向数组第一个元素的指针。

          2. 当您取消引用指针时,您得到的类型是 char,因为指针实际上只指向数组中的第一项。

          像这样使用字符串是 C 风格的代码。使用 C++ 时,您应该改用 std::string。它更容易使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-13
            • 2022-08-05
            • 1970-01-01
            • 1970-01-01
            • 2013-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多