【问题标题】:Subtracting char array from char pointer produces an int?从 char 指针中减去 char 数组会产生一个 int?
【发布时间】:2015-03-01 15:48:14
【问题描述】:

http://www.cplusplus.com/reference/cstring/strchr/strchr 引用中提供了此示例。

/* strchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "This is a sample string";
  char * pch;
  printf ("Looking for the 's' character in \"%s\"...\n",str);
  pch=strchr(str,'s');
  while (pch!=NULL)
  {
    printf ("found at %d\n",pch-str+1);
    pch=strchr(pch+1,'s');
  }
  return 0;
}

为什么从char 指针pch 中减去char 数组str 加上一个会得到int? (由%d 格式类型表示)如果我删除“-str”,程序将不会执行,直到我将%d 更改为%s

【问题讨论】:

  • 数组在表达式中使用时会衰减为指针,指针的差异是它们之间的距离(元素数)。
  • @zch:幸好你消除了 OP 对数组语义的困惑。不过,他的问题呢?

标签: c++ c arrays pointers strchr


【解决方案1】:

您正在研究 C/C++ 和指针的奇怪之处之一。指针和数组的语法和语义简直是疯了。

str 是指向 char(以及数组)的指针。 pch 也是一个指向 char 的指针。

如果将两个指向同一类型的指针相减,则得到它们之间的元素数。

你甚至可以做

    3 [str] ;

相当于

   str[3] ;

并且等价于

   *(str+3) ;

你的表情:

  pch - 1

具有指向 char 的类型指针。你的表情

  pch - str

具有 int 类型。

【讨论】:

  • 您的帖子中没有任何内容涉及 OPs 问题,这是关于差异的类型。此外,指针和数组是根本不同的东西,将它们混为一谈是错误和挫败感的普遍来源,尽管(或者可能更多是因为)存在数组衰减。
【解决方案2】:

简而言之,这是一个错误
该表达式可能是int 类型,或者您可能在对printf 的调用中有Undefined Behavior

让我们一步一步来:

  1. 您实际上不是从指针中减去数组,而是从指针中减去指针:
    在几乎所有情况下,array decays to a pointer to its first element.

  2. 两个指针的区别是什么类型(只有当它们指向或直接指向同一数组中的元素时才定义)?

    ptrdiff_t(这就是&lt;stddef.h&gt; 中的typedef 的用途。)

  3. ptrdiff_t 可能恰好是 int,但不要依赖它。
    相反,请使用正确的格式说明符:%ti

【讨论】:

  • 也许,回答它是更好的决定 (+1)
  • 只是好奇:“数组 name 衰减”是什么? (而不仅仅是“一个数组衰减”)我在这里经常看到这个。
  • @mafso 在适当的链接中编辑以获得更多解释。
  • @πάνταῥεῖ,我知道数组衰减是什么。我的观点是,在 SO 上它总是“数组 name 衰减”。虽然这是正确的,但似乎暗示未由“数组名称”表示的数组不会衰减,这是不正确的。那么,总是强调在我看来完全无关的“名字”又有什么意义呢?想一想,这可能是 C89 的遗产;如果 f().a 是一个数组,在 C89 中它不会衰减。但是如果pint (*)[] 类型,*p 在 C89 中也会衰减,所以即使在那里我也不完全理解。
  • @mafso 链接并没有什么坏处,不是吗?
【解决方案3】:

数组名称衰减为指向其第一个元素的指针(在大多数情况下)。两个指针相减产生ptrdiff_t 类型的数据,前提是两个指针都指向同一个数组的元素。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2021-02-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多