指针和字符数组混淆

时间:2016-12-06 00:15:50

标签: c++ pointers

#include <iostream>
using namespace std;
int main()
{
 char str[] {"TESTING"};
 char *p {str};
 cout << (p++, *++p);
 cout << *p++;
 cout << p;
 return 0;
}

它返回&#34; SSTING&#34;

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

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

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

并且不应该单独说这句话&#34; TESTING&#34;但似乎只说TING

cout << p;

谢谢!

2 个答案:

答案 0 :(得分:2)

让我们一行一行:

char str[] {"TESTING"};

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

char *p {str};

这个定义一个名为p的变量,类型为指向char 的指针,并将其初始化为数组str的第一个字符的地址(第一个{{1} }})。发生这种情况是因为在大多数情况下,数组会自动衰减为指针。

T

这一行做了几件事。 cout << (p++, *++p); 运算符首先计算左侧运算符,,该指针递增指针,现在指向p++;然后它评估右侧运算符E,但这是一个预增量运算符,因此它再次递增指针(它指向*++p)。最后,S运算符访问*指向的内存,结果为p。并且该字符被打印到STDOUT。

S

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

T

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

将所有这些输出放在一起,即可获得TING

答案 1 :(得分:1)

不完全是答案,而是代码所做的细分,

#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;
}