в strchr
ссылка на http://www.cplusplus.com/reference/cstring/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
тип формата) если уберу «-str
«, программа не будет выполняться, пока я не изменю %d
в %s
,
Короче говоря, это ошибка:
Это выражение может иметь тип int
или вы могли бы иметь Неопределенное поведение в призыве к printf
,
Давайте рассмотрим шаг за шагом:
Вы фактически не вычитаете массив из указателя, но указатель из указателя:
Почти во всех контекстах массив распадается на указатель на свой первый элемент.
Каким типом отличается различие двух указателей (которое определяется только в том случае, если они указывают на элементы или находятся непосредственно за элементами одного и того же массива)?
ptrdiff_t
(Вот что это typedef
в <stddef.h>
для.)
ptrdiff_t
может случиться int
, но не зависит от этого.
Вместо этого используйте правильный спецификатор формата: %ti
,
Имена массивов распадаются на указатели (в большинстве случаев) на его первый элемент. Вычитание двух указателей дает данные ptrdiff_t
тип, при условии, что обе точки указывают на элементы одного массива.
Вы смотрите на одну из странностей C / C ++ и указателей. Синтаксис и семантика указателей и массивов — просто чокнутые.
str — указатель на символ (а также массив).
pch также является указателем на символ.
Если вы вычли два указателя одного типа, вы получите количество элементов между ними.
Вы даже можете сделать
3 [str] ;
что эквивалентно
str[3] ;
и эквивалентно
*(str+3) ;
Ваше выражение:
pch - 1
имеет указатель типа на символ. Ваше выражение
pch - str
имеет тип int.