指针和字符数组混淆

Pointer and char array confusion

本文关键字:数组 字符 指针      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main()
{
char str[] {"TESTING"};
char *p {str};
cout << (p++, *++p);
cout << *p++;
cout << p;
return 0;
}

它返回"SSTING">

我知道也许这篇文章并不完全适用于堆栈溢出,但我无法弄清楚它的作用,也找不到任何关于它的文档

cout << (p++, *++p); 

我第一次看到圆括号和逗号...它们的功能是什么?

这行不应该单独说"测试",但它似乎只说 TING

cout << p;

谢谢!

让我们一行一行:

char str[] {"TESTING"};

此行定义一个名为str的变量,其类型为8 个字符的数组,并使用字符TESTING加上 NUL 字符对其进行初始化以标记结尾。

char *p {str};

这个定义了一个名为p的变量,其类型为char 指针,并将其初始化为数组str的第一个 char 的地址(第一个T)。发生这种情况是因为数组在大多数用途中会自动衰减为指针。

cout << (p++, *++p);

这条线做了几件事。,运算符首先计算左侧运算符p++,即递增指针,现在指向E;然后它计算右侧运算符*++p,但这是一个预递增运算符,因此它再次递增指针(它指向S)。最后*算子访问p所指的内存,结果是S。这个字符被打印到STDOUT中。

cout << *p++;

这个很容易。*运算符访问p指向的字符(再次S)并将其打印在 STDOUT 中。然后它递增指针,因为它是一个后递增运算符。现在它指向第二个T

cout << p;

至少,此行打印p指向的字符串,直到找到 NUL 字符。由于p指向数组的第二个T,因此它将打印TING

将所有这些输出放在一起,您会得到SSTING

不完全是答案,而是代码在做什么的细分,

#include <iostream>
using namespace std;
int main()
{
char str[]{"TESTING"};
char *p{str}; // p points to: 'T'
p++;          // p points to: 'E'
++p;          // p points to: 'S'
cout << *p;   // output a single char: 'S'
cout << *p;   // ouptut a single char: 'S'
p++;          // p points to: 'T'
cout << p;    // output a (char *) type pointer, AKA a C-string, "TING";
return 0;
}