数组上的指针算术

时间:2016-01-17 21:41:26

标签: c++ arrays pointers

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

我理解它的方式是<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" <!-- right here --> android:layout_height="100dp" android:background="@drawable/backgroundgeneral" android:padding="10dp" <!-- editted --> android:orientation="vertical" > 指向ptr数组的第一个元素的地址。我认为Str应该导致+ {5}元素ptr + 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

2 个答案:

答案 0 :(得分:6)

宣布:

char Str[] = "abcdefg"

字符串abcdefg隐式存储有一个额外的字符\0,用于标记字符串的结尾。

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

如果您只想打印当前字符,请执行以下操作::

cout << *ptr;

答案 1 :(得分:2)

  

为什么显示fg

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

你的阵列:

char Str[] = "abcdefg";

在结尾处隐式赋值'\0',并将其视为C样式字符串。

  

是否与std::cout如何显示数组有关?

这与std::cout处理C-style strings的方式有关,要测试此更改数组类型为int并查看差异,即它将打印单个元素。

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