数组上的指针算术

pointer arithmetic on arrays

本文关键字:指针 数组      更新时间:2023-10-16

当我运行下面的代码时,我的输出不是我所期望的。

我的理解方式是ptr指向Str数组第一个元素的地址。我认为ptr + 5应该导致 + 第 5 个元素,即 f .因此,输出应仅显示f,而不是同时显示fg

为什么显示fg?它与cout显示数组的方式有关吗?

#include <iostream>
using namespace std;
int main()
{
    char *ptr;
    char Str[] = "abcdefg";
    ptr = Str;
    ptr += 5;
    cout << ptr;
    return 0;
}

预期输出:f

实际输出:fg

当您声明:

char Str[] = "abcdefg"

字符串abcdefg隐式存储,并带有一个额外的字符,该字符标记字符串的末尾。

因此,当您cout char*时,输出将是存储在char *指向的所有字符以及char*后存储在连续内存位置中的所有字符,直到在其中一个内存位置遇到字符!由于在您的示例中字符在 g 之后,因此打印了 2 个字符。

如果您只想打印当前字符,则应这样做::

cout << *ptr;

为什么显示fg

std::cout << char* 打印字符串直到末尾而不是字符串的单个字符的原因是 ,std::coutchar *视为指向 C 样式字符串的第一个字符的指针并按此打印。1

您的阵列:

char Str[] = "abcdefg";

在末尾隐式分配一个'',并将其视为 C 样式字符串。

它与std::cout如何显示数组有关吗?

这与std::cout如何处理 C 样式字符串有关,为了测试这一点,请将数组类型更改为 int 并查看差异,即它将打印单个元素。


1.这是因为在C中没有字符串类型,字符串是通过类型char的指针操作的,指示开始和终止字符:'',表示结束。