【问题标题】:Incrementing char pointers in C++在 C++ 中递增 char 指针
【发布时间】:2013-05-06 02:08:40
【问题描述】:

为什么要程序,

char *s, *p, c;

s = "abc";

printf(" Element 1 pointed to by S is '%c'\n", *s);
printf(" Element 2 pointed to by S is '%c'\n", *s+1);
printf(" Element 3 pointed to by S is '%c'\n", *s+2);
printf(" Element 4 pointed to by S is '%c'\n", *s+3);
printf(" Element 5 pointed to by S is '%c'\n", s[3]);
printf(" Element 4 pointed to by S is '%c'\n", *s+4);

给出以下结果?

 Element 1 pointed to by S is 'a'
 Element 2 pointed to by S is 'b'
 Element 3 pointed to by S is 'c'
 Element 4 pointed to by S is 'd'
 Element 5 pointed to by S is ' '
 Element 4 pointed to by S is 'e'

编译器是如何继续这个序列的?为什么s[3] 返回一个空值?

【问题讨论】:

  • 优先级。你想要*(s+1) 等。但*(s+4) 将是未定义的行为。
  • s[3] 返回第 4 个字符(它们从 0 开始索引),它是一个以 \0 字符结尾的字符串。
  • s[3]\0,所以没有显示
  • 我对 Element 5 的输出持怀疑态度 - 引号之间不应有空格。
  • 顺便说一句,如果您使用 C++ 而不是纯 C 进行编码,请不要使用 printfstd::cout(来自头文件<iostream>)更安全、更易于使用且不易出错。

标签: c++ pointers char


【解决方案1】:

它不会继续这个序列。您正在执行*s+3,它首先取消引用s,为您提供char,其值为'a',然后您将添加到该char 值。将 3 添加到 'a' 会得到 'd' 的值(至少在您的执行字符集中)。

如果您将它们更改为*(s+1) 等等,您将获得预期的未定义行为。

s[3] 访问字符串的最后一个元素,即空字符。

【讨论】:

  • 一个提示 - "abc" 通常不是一个好的测试字符串 - 很容易从不正确的代码中意外获得预期结果(或令人困惑的结果)。
【解决方案2】:

注意*s 是一个字符,本质上是一个数字。向其中添加另一个数字会产生具有更高 ASCII 值的字符。 s[3] 为空,因为您只将“abc”分别分配给条目 0、1、2。事实上,第 3 个字符是 '\0' 字符。

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2012-12-29
    • 2015-10-09
    • 2017-05-18
    • 2010-09-23
    • 2017-01-05
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多