【问题标题】:Pointers with character array variables带有字符数组变量的指针
【发布时间】:2020-04-27 07:59:39
【问题描述】:

我正在学习 C++ 并且正在理解指针并创建了以下代码

#include<string>
using namespace std;
int main()
{
    char s[100] = "Today is a rainy day";
    cout<<s[0]<<endl;
    char *p;
    p = s;
    cout <<s<<endl;
    cout<<p<<endl;
    cout<<*p<<endl;
}

在这段代码中,我假设 s 指向数组的起始地址,打印指针 p 会给我地址,*p 会给我数组的第一个元素。

我的输出格式为

T
Today is a rainy day
Today is a rainy day
T

在这里,p 和 s 都打印出我不理解的完整字符数组,即使 p 现在只是一个数组,也使用 *p 打印出第一个元素。

当我们在这样的数组中使用指针时,指针是如何工作的,这是我想了解的。

【问题讨论】:

  • 指针只是一个内存地址值(即 unsigned long long)。 *p 正在访问它指向的地址上的内存,与 s[0] 相同。 ++p 或 --p 将指针移动到下一个或根据数据类型大小预览内存地址。如果是 char 向前或向后一个字节。
  • s 是一个数组,它不是指向数组第一个元素的指针,p 是指针,而不是数组。显而易见的事情是真实的。您感到困惑的是,在某些情况下,s 可以被解释为指向数组第一个元素的指针,但这并不能改变 s 始终是一个数组这一事实。
  • 数组什么时候指向第一个元素,什么时候表现得像这里的整个字符串
  • @shawnindamnen 当您在几乎任何表达式中使用数组名称时,它都会被解释为指针(重要的例外是在sizeof 表达式中使用它时)。当您将 char* 指针传递给 cout (cout &lt;&lt; s) 时,cout 会使用该指针来打印整个字符串。这就是cout &lt;&lt; 的写法。这是一个特例。
  • @shawnindamnen 如果您尝试不同类型的数组(比如int 数组),您会发现 cout 不会打印整个数组。正如我所说的 char 指针和 cout 是一个特例。

标签: c++ arrays pointers


【解决方案1】:

指针和数组的区别只存在于编译时。 在运行时它们是相同的,衰减为指针。

对于编译时的数组,您可以找到它的维度,并将其用作模板代码中的参数。见std::is_arraystd::extent等。

【讨论】:

    【解决方案2】:

    当您取消引用数组或指针时,您最终会得到一个char。如您所料,这会打印出 char

    但是,当您提供 char*(这是您在数组和指针情况下得到的结果,因为数组在此处衰减为指针)时,将调用 char*operator&lt;&lt; 的重载.

    此重载将它看到的任何char* 视为 C 字符串,这就是您看到它打印出来的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2014-11-16
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多