3

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

int *pPointer = &iTuna;

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

现在看到这个程序

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

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

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

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

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

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

4

7 回答 7

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

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

  3. 取消引用指向数组第一个元素的指针会为您提供数组的第一个元素,即'H'. 这等同于pStr[0]

于 2012-08-03T15:04:14.647 回答
2

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

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

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

于 2012-08-03T15:06:19.600 回答
1

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

字母以该顺序存储在每个存储单元中,并有一个额外的最后一个单元保存 0 以标记结束。

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

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

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

*意味着您要求该地址的价值。 cout << 知道该地址包含一个字符,因此打印该字符。

于 2012-08-03T15:04:32.173 回答
1

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

您的问题是 << 运算符已被流上的各种数据类型覆盖。因此,标准库编写者让操作符 << 对 char * 类型的任何变量执行特定操作(在这种情况下,特定操作意味着在该地址输出字符,直到您到达字符串标记的末尾),而不是什么您期望它这样做(以十进制或十六进制打印地址)

同样, << 运算符已被 char 覆盖以仅输出单个字符,如果您稍微考虑一下,您会意识到 *pStr 是一个指向字符的取消引用指针 - 也就是说它是一个字符 - 因此它只是打印一个字符。

于 2012-08-03T15:05:56.353 回答
1
  1. 您还需要了解字符串的概念。在 C 和 C++ 中,字符串是在内存中一个接一个地定位的几个字符(char),基本上是 'H','e','l','l','o','\0'。您的指针保存第一个符号的内存地址,并且您的 C++ 库知道字符串是从该地址开始并以 '\0' 结尾的所有内容。

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

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

于 2012-08-03T15:08:26.877 回答
1
  1. 指针指向*pStr特定的内存地址,但该内存地址不仅可以用作单个元素,即 a char,还可以用作此类元素的数组或内存块的开头。

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

  3. 这种行为就像您从自己的分析中所期望的那样:取消引用pStr只是为您提供内存地址处的值,在这种情况下是内存中数组的第一个元素chars

于 2012-08-03T15:12:46.940 回答
0
  1. 指向数组的指针(C 风格的字符串是 char 数组)只是指向数组第一个元素的指针。

  2. << 运算符为 char* 类型重载以将其视为 C 样式字符串,因此当您将 char* 传递给它时,它会从您给它的指针开始并不断向它添加 1 以查找下一个字符,直到它找到表示字符串结束的空字符。

  3. 当您取消引用指针时,您得到的类型是 char 因为指针实际上只指向数组中的第一项。<< for char 的重载不会将其视为字符串,而是将其视为单个字符。

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

于 2012-08-03T15:08:01.203 回答