从 char 指针中减去 char 数组产生一个 int?

Subtracting char array from char pointer produces an int?

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

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

简而言之,这是一个 bug:
该表达式可能是 int 类型,或者您可能在对 printf.

的调用中有 未定义行为

让我们一步步来:

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

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

    ptrdiff_t(这就是 <stddef.h> 中的 typedef 的用途。)

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

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

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

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

你甚至可以做到

    3 [str] ;

相当于

   str[3] ;

相当于

   *(str+3) ;

你的表情:

  pch - 1

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

  pch - str

具有类型 int。