按指针制作字符串

时间:2012-08-03 15:00:07

标签: c++ string pointers

我已经知道指针指向一个内存地址,所以我可以用它来改变在该地址设置的值。像这样:

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指向的所有内容。

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

7 个答案:

答案 0 :(得分:10)

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

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

  3. 取消引用指向数组第一个元素的指针,可以得到数组的第一个元素,即'H'。这与pStr[0]相同。

答案 1 :(得分:2)

1-)由于pStr指向char,它实际上指向null terminated string

数组的开头

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

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

答案 2 :(得分:1)

  

1-)在“你好!”每个字母单独存储,指针保持不变   一个记忆地址。那么pStr如何指向所有字母。

字母以每个存储单元的顺序存储,并带有额外的最终单元格 保持0表示结束。

  

2-)另外当我打印出pStr时它打印Hello!不是记忆地址。

cout <<了解您指向一个字符串,因此打印字符串。

  

3-)当我打印出* pStr时,它打印出H而不是所有pStr   也是如此。

*表示您要求该地址的值。 cout <<知道该地址包含一个char,因此打印出char。

答案 3 :(得分:1)

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

你的问题是&lt;&lt;已针对流上的各种数据类型重写了运算符。因此标准库编写者已经使操作符&lt;&lt;在char *类型的任何变量上做一些特定的事情(在这种情况下,特定的东西意味着输出该地址的字符,直到你到达字符串标记的末尾),而不是你期望它做什么(打印十进制地址)或十六进制)

类似地&lt;&lt;运算符已被覆盖为char只输出一个字符,如果你稍微想一下,你会发现* pStr是一个指向字符的解引用指针 - 也就是它是一个字符 - 因此它只打印一个字符。

答案 4 :(得分:1)

  1. 您还需要了解字符串的概念。在C和C ++中,字符串是一个在存储器中一个接一个地定位的字符(char),基本上是'H','e','l','l','o','\ 0'。你的指针保存第一个符号的内存地址,你的C ++库知道一个字符串就是从这个地址开始并以'\ 0'结尾的一切。

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

  3. 构造* pStr意味着“给我任何位于存储在pStr中的地址”。那将是char - 一个单个字符 - 'H',然后传递给cout,你只能打印一个字符。

答案 5 :(得分:1)

  1. 指针*pStr指向特定的内存地址,但该内存地址不仅可以用作单个元素,即char,还可以作为一个开头这些元素的数组或内存块。

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

  3. 这种行为正如您对自己的分析所期望的那样:取消引用pStr只是为您提供内存地址的值,在本例中是{{{I}数组的第一个元素。 1}}在记忆中。

答案 6 :(得分:0)

  1. 指向数组的指针(C样式字符串是char数组)只是指向数组第一个元素的指针。

  2. &lt;&lt;运算符被重载为char *类型,将其视为C风格的字符串,所以当你传递一个char *时,它会从你给它的指针开始并继续向它添加1来查找下一个字符,直到找到null为止表示字符串结束的字符。

  3. 当您取消引用指针时,您获得的类型是char,因为指针实际上只指向数组中的第一个项目。 &lt;&lt;&lt;&lt;对于char,它不会将其视为字符串,只是作为单个字符。
  4. 使用这样的字符串是C风格的代码。使用C ++时,您应该使用std :: string。它更容易使用。