我已经知道指针指向一个内存地址,所以我可以用它来改变在该地址设置的值。像这样:
int *pPointer = &iTuna;
pPointer
此处的内存地址为iTuna
。因此,我们可以使用pPointer
来更改iTuna
处的值。如果我打印pPointer
,则会打印内存地址,如果我打印*pPointer
,则会打印iTuna
处的值
现在看这个程序
char* pStr= "Hello !";
cout<< pStr << endl;
cout<< *pStr << endl;
system("PAUSE");
return 0;
这里有很多我不理解的东西:
在“你好!”每个字母分别存储,指针保存一个存储器地址。那么pStr
如何指向所有字母。
此外,当我打印出pStr
时,它会打印 Hello!,而不是内存地址。
当我打印出*pStr
时,它打印出 H ,而不是pStr
指向的所有内容。
我真的无法理解这些是我的担忧。我希望有人可以向我解释这是如何工作的广告帮助我理解
答案 0 :(得分:10)
"Hello !"
是类型为char const[8]
且值为{ 'H', 'e', 'l', 'l', 'o', ' ', '!', 0 }
的数组。 pStr
是指向其第一个元素的指针;它的最后一个元素的值为0
。
iostreams库中有一个char const *
参数的重载,它将参数视为指向数组第一个元素的指针,并打印每个元素直到遇到零。 (用口语说法的“以空字符结尾的字符串”。)
取消引用指向数组第一个元素的指针,可以得到数组的第一个元素,即'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)
您还需要了解字符串的概念。在C和C ++中,字符串是一个在存储器中一个接一个地定位的字符(char),基本上是'H','e','l','l','o','\ 0'。你的指针保存第一个符号的内存地址,你的C ++库知道一个字符串就是从这个地址开始并以'\ 0'结尾的一切。
当您将char *传递给cout时,它知道您输出一个字符串,并将其打印为字符串。
构造* pStr意味着“给我任何位于存储在pStr中的地址”。那将是char - 一个单个字符 - 'H',然后传递给cout,你只能打印一个字符。
答案 5 :(得分:1)
指针*pStr
指向特定的内存地址,但该内存地址不仅可以用作单个元素,即char
,还可以作为一个开头这些元素的数组或内存块。
char
数组是C中特殊类型的数组,因为某些操作以特定方式处理它们:作为字符串。因此,printf("%s", ...
和cout
知道当给定char *
时,他们应该查找字符串,并打印所有字符,直到终止null
字符。此外,C提供了一个字符串库,其功能旨在将这些char *
作为字符串进行操作。
这种行为正如您对自己的分析所期望的那样:取消引用pStr
只是为您提供内存地址的值,在本例中是{{{I}数组的第一个元素。 1}}在记忆中。
答案 6 :(得分:0)
指向数组的指针(C样式字符串是char数组)只是指向数组第一个元素的指针。
&lt;&lt;运算符被重载为char *类型,将其视为C风格的字符串,所以当你传递一个char *时,它会从你给它的指针开始并继续向它添加1来查找下一个字符,直到找到null为止表示字符串结束的字符。
使用这样的字符串是C风格的代码。使用C ++时,您应该使用std :: string。它更容易使用。