【问题标题】:Questions asks to work with pointers to return portion of string问题要求使用指针返回字符串的一部分
【发布时间】:2021-09-09 23:29:07
【问题描述】:
int main (void)
{
char c[] = "KATEWINCE";
char *p =c;
printf("%s", p+p[3]-p[1]) ;
return (0);
}

输出是 WINCE,但我不明白代码是如何工作的,请解释一下。

【问题讨论】:

  • 假设您的字符是 ASCII 编码,查找字符 p[3]p[1] 的 ASCII 值。然后就是简单的指针算术
  • 我还建议你拿一些方格纸,将数组c中的每个字母写在自己的方格中,然后做一个指向第一个字符的箭头。这个箭头是指针p。然后添加p[3] 正方形并使箭头指向该正方形。然后减去p[1] 并再次重绘箭头。这可能有助于您了解正在发生的事情。
  • p+p[3]-p[1]p + 'E' - 'A' 并假设字母编码是连续的,即p + 4 这是"WINCE" 开始的地方。
  • 这是您在上课时分配的作业吗?这是一个可怕的、毫无意义的问题。指针算法是完全合理的;我们一直这样做。减去两个字符的值有时是有意义的(这并没有错)。但是很难想出一个现实的原因,为什么要减去两个字符的值,然后使用差值来做这样的指针运算。如果您了解printf("%s", p+4) 打印“WINCE”的原因,您就会了解指针运算的基本属性。字符减法只是混淆。
  • 是的,我知道了...感谢您的帮助,是的,这是作业的一部分。

标签: c pointers arithmetic-expressions


【解决方案1】:

您将 0x45 分配给 c[3]/p[3][1]

您将 0x41 分配给 c[1]/p[1][1]

所以p + p[3] - p[1] 等价于p + 0x45 - 0x41

这会尝试将 p 推进 0x45 个元素。这是未定义的行为。您可以将指针前移到紧随其指向的对象之后的位置,但不能进一步。 c 并没有那么大。

但是假设c 要大得多。您会看到与您在此处发布的结果相同的结果。

p 前移 0x45 个元素,然后反转 0x41 个元素。最终结果是p 提前了 4 个元素。这正是我们所看到的。


  1. 假设是基于 ASCII 的机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多