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

时间:2015-01-03 16:31:52

标签: c++ c arrays pointers strchr

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指针str中减去char数组pch加上一个int? (由%d格式类型表示)如果我删除&#34; -str&#34;,程序将不会执行,直到我将%d更改为{{1 }}

3 个答案:

答案 0 :(得分:4)

缺点是, bug
该表达式可能属于int类型,或者您在调用printf时可能有未定义行为

让我们一步一步地采取行动:

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

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

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

如果你减去两个指向同一类型的指针,你会得到它们之间的元素数量。

你甚至可以做

    3 [str] ;

相当于

   str[3] ;

并且相当于

   *(str+3) ;

你的表达:

  pch - 1

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

  pch - str

的类型为int。