【发布时间】: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 << s) 时,cout 会使用该指针来打印整个字符串。这就是cout <<的写法。这是一个特例。 -
@shawnindamnen 如果您尝试不同类型的数组(比如
int数组),您会发现 cout 不会打印整个数组。正如我所说的 char 指针和 cout 是一个特例。