首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针和字符数组混淆

指针和字符数组混淆
EN

Stack Overflow用户
提问于 2016-12-06 00:15:50
回答 2查看 59关注 0票数 0
代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
 char str[] {"TESTING"};
 char *p {str};
 cout << (p++, *++p);
 cout << *p++;
 cout << p;
 return 0;
}

它返回"SSTING“

我知道这篇文章可能不是专门针对堆栈溢出的,但我不知道它能做什么,也找不到任何关于它的文档。

代码语言:javascript
复制
 cout << (p++, *++p); 

我第一次看到圆括号时.他们的功能是什么?

这句话不应该只说“测试”,但似乎只说“丁”

代码语言:javascript
复制
cout << p;

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-06 00:30:11

让我们一条条地走:

代码语言:javascript
复制
char str[] {"TESTING"};

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

代码语言:javascript
复制
char *p {str};

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

代码语言:javascript
复制
cout << (p++, *++p);

这一行做了几件事。,运算符首先计算增加指针的左手操作符p++,现在指向E;然后计算右操作符*++p,但这是一个增量前运算符,因此它再次增加指针(指向S)。最后,*操作符访问p指向的内存,结果是一个S。这个字印在STDOUT上。

代码语言:javascript
复制
cout << *p++;

这个很简单。*操作符访问p (再次是S )所指向的字符,并在STDOUT中打印它。然后,它增加指针,因为它是一个后增量运算符。现在它指向第二个T

代码语言:javascript
复制
cout << p;

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

将所有这些输出组合在一起,就可以得到SSTING

票数 2
EN

Stack Overflow用户

发布于 2016-12-06 00:35:44

不完全是答案,而是代码的分解,

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40985704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档