指针和字符数组混淆
Pointer and char array confusion
#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;
}
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符